2011-01-19 11 views
38

Jakie pozwolenie jest potrzebne, aby PRZYZNAĆ użytkownika, w MSSQL, aby móc skrócić tabelę?Uprawnienia do obcinania tabeli

Próbuję przyznać minimalny zestaw uprawnień, ale nie mogę użyć polecenia DELETE, ponieważ tabela jest bardzo duża i chcę, aby operacja była szybka.

Odpowiedz

68

Potrzebujesz uprawnienia ALTER: zobacz Uprawnienia sekcja here.

Należy pamiętać, że można również użyć procedury składowanej w poleceniu WYKONAJ AS, aby użytkownik uruchamiający procedurę składowaną nie musiał nawet otrzymać uprawnienia ALTER.

+1

Nie tylko była to odpowiedź prawidłowa, ale wziął się „uczyć człowieka do ryb”, wskazując dokumentacji więc takie odpowiedzi można znaleźć OP w przyszłości. Dlaczego upadek? –

+2

@Ben - Podejrzewam, że PO opublikował tę odpowiedź na temat nanosekundy po opublikowaniu pytania. Nie padłem jednak na złe, ponieważ pozwala na to FAQ. –

+0

@Martin - to nie była nanosekunda. To było 2 minuty - tyle czasu zajęło mi znalezienie odpowiedzi. –

8

Minimalna wymagana jest zgoda ALTER na table_name. TRUNCATE TABLE uprawnienia domyślnie do tabeli właściciel, członkowie sysadmin ustalona rola serwera i db_owner i db_ddladmin ustalone role bazy danych i nie są przenoszalne. Jednakże można dołączyć instrukcja TRUNCATE TABLE w module, na przykład procedura składowana i przyznać odpowiednie uprawnienia do modułu przy użyciu klauzuli EXECUTE AS. Aby uzyskać więcej informacji na temat , zobacz Korzystanie z EXECUTE AS do Tworzenie niestandardowych zestawów uprawnień.

Source

1

nie przyznają, ukryć ...

CREATE TRIGGER TRG_MyTable_Foo 
WITH EXECUTE AS OWNER 
INSTEAD OF DELETE 
AS 
IF CONTEXT_INFO() = 0x9999 
BEGIN 
    TRUNCATE TABLE MyTable 
    SET CONTEXT_INFO 0x00 
END 
GO 

SET CONTEXT_INFO 0x9999 
DELETE MyTable WHERE 1=0 

SET CONTEXT_INFO może być jest bez wątpienia lepiej oddzielić normalny DELETE z tabeli TRUNCATE

Nie próbowałem tego ...

Edytuj: zmieniono na USTAW CONTEXT_INFO.

+0

+1 Powiedziałbym, że "SET CONTEXT_INFO" będzie koniecznością, aby uniknąć wywołania nieprzyjemnej niespodzianki! –

+1

-1 To spowodowałoby usunięcie, które trafi zero wierszy, obcina tabelę. Zwykle jesteś świetnym pomocnikiem, ale jest to niepojęty hack imho. – Andomar

+0

@Andomar: tak, poprawione. Nie przemyślałem tego w pełni ani nie zaktualizowałem odpowiedzi wystarczająco szybko. – gbn

7

Można utworzyć procedurę przechowywaną with execute as owner:

create procedure dbo.TruncTable 
with execute as owner 
as 
truncate table TheTable 
go 

Następnie przyznaniu uprawnienia wykonawcze do ktokolwiek musi obciąć tej tabeli:

grant execute on TruncTable to TheUser 

Teraz TheUser można obciąć tabelę jak:

exec dbo.TruncTable 
0

Można utworzyć procedurę składowaną z exec ute jako właściciel tylko do jednej tabeli lub procedury sklepu do każdej tabeli:

CREATE PROCEDURE [dbo].[spTruncate] 
    @nameTable varchar(60) 
    WITH EXECUTE AS OWNER 
    AS 

SET NOCOUNT OFF; 
DECLARE @QUERY NVARCHAR(200); 

SET @QUERY = N'TRUNCATE TABLE ' + @nameTable + ';' 

EXECUTE sp_executesql @QUERY; 
+5

To jest niebezpieczne! – Graeme

Powiązane problemy