Как я могу сохранить свою таблицу от усечения в SQL Server - PullRequest
0 голосов
/ 23 ноября 2018

Мне нужно ограничить таблицу от update и delete.

Для Update и Delete Я использую триггер Instead of, и он работает нормально.

Но если я использую команду TRUNCATE, она стирает мои данные.

Мне нужно ограничить truncate или любой другой процесс модификации таблицы.

Может кто-нибудь дать ваши ценные предложения.

1 Ответ

0 голосов
/ 23 ноября 2018

Чтобы выполнить оператор 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;
...