Чтобы выполнить оператор TRUNCATE
, вам необходимо иметь права доступа ALTER
для объекта;согласно документации: TRUNCATE TABLE (Transact-SQL) - разрешения .
Если вы хотите запретить пользователю / роли использовать оператор TRUNCATE
для таблицы, вам потребуетсяиспользовать следующее (замена текста в фигурных скобках ({}
)):
USE {YourDatabase}
DENY ALTER ON {YourTable} TO {User/Role};
Вы можете легко проверить, работает ли это с помощью скрипта быстрого теста:
USE Sandbox;
GO
CREATE TABLE dbo.TestTable (Id int IDENTITY(1,1), String varchar(10));
INSERT INTO dbo.TestTable (String)
VALUES ('asdfhj'),('asdjkas'),('asdjkhsad');
GO
CREATE USER TestUser WITHOUT LOGIN;
ALTER ROLE db_ddladmin ADD MEMBER TestUser;
ALTER ROLE db_datareader ADD MEMBER TestUser;
ALTER ROLE db_datawriter ADD MEMBER TestUser;
GO
EXECUTE AS USER = 'TestUser';
GO
TRUNCATE TABLE dbo.TestTable; --This works
GO
REVERT;
GO
SELECT *
FROM dbo.TestTable;
INSERT INTO dbo.TestTable (String)
VALUES ('asdfhj'),('asdjkas'),('asdjkhsad');
DENY ALTER ON dbo.TestTable TO TestUser;
GO
EXECUTE AS USER = 'TestUser';
GO
TRUNCATE TABLE dbo.TestTable; --This fails
GO
REVERT;
GO
SELECT *
FROM dbo.TestTable;
GO
--Clean up
DROP TABLE dbo.TestTable;
DROP USER TestUser;