Разрешения на усечение таблицы
Какое разрешение требуется для предоставления пользователю, в 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;