Mam konto SQL z następującymi uprawnieniami w bazie danych:
db_executor
Rola widać to konto będąc członkiem został stworzony przez ten skrypt:
CREATE ROLE [db_executor] AUTHORIZATION [dbo]
GO
GRANT EXECUTE TO [db_executor]
GO
Kiedy uruchomić select
, update
, insert
lub delete
na stole, to działa dobrze. Gdy próbuję przejść truncate
do tabeli, pojawia się następujący komunikat o błędzie:
Nie można znaleźć obiektu „TableName”, ponieważ nie istnieje lub nie masz uprawnień.
Jakiego uprawnienia brakuje na tym koncie?
sql-server
sql-server-2012
permissions
Mansfield
źródło
źródło
TRUNCATE TABLE
to DDL, a nie DML.Odpowiedzi:
Najlepszym miejscem do poszukiwania tych informacji są książki online. Artykuł
TRUNCATE TABLE
tutaj wskazuje:ALTER to wymagane minimalne uprawnienia. Możesz uzyskać to jako właściciel DB, możesz uzyskać jako DB_DDLAdmin. Lub po prostu przyznaj alter.
Jeśli pomyślisz o tym, co robi obcinanie i jak działa, ma to sens, jest to dość „surowe” polecenie, które opróżnia tabelę danych i robi to szybko.
źródło
Zgodnie z tym odniesieniem w BOL :
źródło
Możesz utworzyć procedurę przechowywaną z wykonaniem jako właściciel tylko jednej tabeli lub procedurą przechowywaną do dowolnej tabeli. W następnym kodzie jest przechowywana procedura do obcinania dowolnej tabeli bez udzielania zgody
db_owner
lub innych:źródło
Możesz utworzyć procedurę przechowywaną z wykonaniem jako właściciel tylko jednej tabeli lub procedurą przechowywaną do dowolnej tabeli. W następnym kodzie jest przechowywana procedura do obcinania dowolnej tabeli bez udzielania zgody db_owner lub innej. W tej wersji SP zawarto obsługę błędów i zapobieganie iniekcji SQL
źródło
O ile rozumiem, Ścinanie nie jest czymś, co można cofnąć. Dlatego rozpoczęcie transakcji / zatwierdzenie transakcji nie jest konieczne.
źródło
BEGIN TRANSACTION RADHE SELECT @@TRANCOUNT select * from [dbo].[mytable] truncate table [dbo].[mytable] rollback select * from [dbo].[mytable] /*COMMIT TRAN RADHE*/ SELECT @@TRANCOUNT