Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQL Server中从truncate保存表_Sql Server_Truncate - Fatal编程技术网

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;