Sql server 如何在SQL Server中从truncate保存表
我需要限制我的表从Sql server 如何在SQL Server中从truncate保存表,sql-server,truncate,Sql Server,Truncate,我需要限制我的表从更新和删除 对于Update和Delete,我使用了而不是触发器,它工作正常 但是如果我使用TRUNCATE命令,它会删除我的数据 我需要限制truncate或任何其他表修改过程 任何人都可以给出您有价值的建议。要运行TRUNCATE语句,您需要对对象拥有ALTER权限;根据文件: 如果要阻止用户/角色在表上使用TRUNCATE语句,则需要使用以下命令(替换大括号({})中的文本): 您可以通过快速测试脚本轻松测试: USE Sandbox; GO CREATE TABLE
更新
和删除
对于Update
和Delete
,我使用了而不是触发器,它工作正常
但是如果我使用TRUNCATE
命令,它会删除我的数据
我需要限制truncate
或任何其他表修改过程
任何人都可以给出您有价值的建议。要运行TRUNCATE
语句,您需要对对象拥有ALTER
权限;根据文件:
如果要阻止用户/角色在表上使用TRUNCATE
语句,则需要使用以下命令(替换大括号({}
)中的文本):
您可以通过快速测试脚本轻松测试:
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;
你的意思是你不希望其他人能够对该表运行TRUNCATE
?一个词:权限。是的,Larnu先生。没有人能够对表执行TRUNCATE权限或限制都可以帮助您:TRUNCATE是一个DDL命令,delete DML。权限是您需要研究的,您可以显式拒绝访问,必要时只截断,拒绝将始终覆盖任何允许权限。
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;