Разрешения на усечение таблицы

Какое разрешение требуется для предоставления пользователю, в MSSQL, возможности усечения таблицы?

Я пытаюсь предоставить минимальный набор разрешений, но я не могу использовать DELETE, потому что таблица очень большая, и я хочу, чтобы операция была быстрой.

Ответ 1

Вам нужно разрешение ALTER: см. раздел Разрешения здесь.

Обратите внимание, что вы также можете использовать хранимую процедуру с EXECUTE AS, чтобы пользователь, выполняющий хранимую процедуру, не нуждался даже в предоставлении разрешения ALTER.

Ответ 2

Минимальное требуемое разрешение ALTER на имя_таблицы. TRUNCATE TABLE разрешения по умолчанию для таблицы владелец, члены sysadmin исправлены сервер и db_owner и db_ddladmin фиксированные роли базы данных и не подлежат передаче. Однако вы можете включить TRUNCATE TABLE в модуле, например хранимую процедуру и грант соответствующие разрешения для модуля используя предложение EXECUTE AS. Для большего информацию см. в разделе Использование EXECUTE AS для Создание пользовательских разрешений.

Источник

Ответ 3

Вы можете создать хранимую процедуру with execute as owner:

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

Затем предоставите разрешения на выполнение тем, кому необходимо обрезать эту таблицу:

grant execute on TruncTable to TheUser

Теперь TheUser может обрезать таблицу следующим образом:

exec dbo.TruncTable

Ответ 4

Не показывать, скрывать...

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 может быть без каких-либо сомнений лучше, чтобы отделить обычный DELETE от таблицы TRUNCATE

Я не пробовал это...

Изменить: изменено для использования SET CONTEXT_INFO.

Ответ 5

Вы можете создать хранимую процедуру с выполнением в качестве владельца только одной таблицы или процедуры хранения в любой таблице:

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;