如何从 SQL 服务器中的 truncate 保存我的 table
How can I save my table from truncate in SQL Server
我需要限制我的 table 来自 update
和 delete
。
对于 Update
和 Delete
我使用的是 Instead of
触发器,它工作正常。
但是如果我使用 TRUNCATE
命令,它会删除我的数据。
我需要限制 truncate
或任何其他 table 修改过程。
谁能给点宝贵的建议。
要运行一个TRUNCATE
语句你需要有对象的ALTER
权限;根据文档:TRUNCATE TABLE (Transact-SQL) - Permissions.
如果要阻止 user/role 在 table 上使用 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;
我需要限制我的 table 来自 update
和 delete
。
对于 Update
和 Delete
我使用的是 Instead of
触发器,它工作正常。
但是如果我使用 TRUNCATE
命令,它会删除我的数据。
我需要限制 truncate
或任何其他 table 修改过程。
谁能给点宝贵的建议。
要运行一个TRUNCATE
语句你需要有对象的ALTER
权限;根据文档:TRUNCATE TABLE (Transact-SQL) - Permissions.
如果要阻止 user/role 在 table 上使用 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;