管理员如何防止自己删除或截断特定表,因为有时表被意外截断或删除,制作视图不是一个好主意。如果我做一个触发器,它会在 db 的所有表中实现。我只想在特定表中实现它,在 sql server 中?
问问题
190 次
3 回答
0
Create TRIGGER [TR_ProtectCriticalTables]
ON DATABASE
FOR
DROP_TABLE
AS
DECLARE @eventData XML,
@uname NVARCHAR(50),
@oname NVARCHAR(100),
@otext VARCHAR(MAX),
@etype NVARCHAR(100),
@edate DATETIME
SET @eventData = eventdata()
SELECT
@edate=GETDATE(),
@uname=@eventData.value('data(/EVENT_INSTANCE/UserName)[1]', 'SYSNAME'),
@oname=@eventData.value('data(/EVENT_INSTANCE/ObjectName)[1]', 'SYSNAME'),
@otext=@eventData.value('data(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]',
'VARCHAR(MAX)'),
@etype=@eventData.value('data(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)')
IF @oname IN ('tbluser')-- You can give comma seperated list here
BEGIN
DECLARE @err varchar(100)
SET @err = 'Table ' + @oname + ' is super duper protected and cannot be dropped.'
RAISERROR (@err, 16, 1) ;
ROLLBACK;
END
GO
ENABLE TRIGGER [TR_ProtectCriticalTables] ON DATABASE
要禁用截断试试这个
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'TestTable',
@role_name = NULL
GO
这可能会导致一些其他问题,所以请在使用前检查。
于 2012-11-09T06:59:27.737 回答
0
只需删除特殊管理员的权限目录即可。并创建第二个用户,该用户有权执行此类危险工作。
另请参见GRANT 和 REVOKE SQL 命令。
于 2012-11-09T06:51:19.800 回答
0
请为具有以下所有权限的超级管理员创建用户并创建触发器:
CREATE TRIGGER reminder2
ON Customer
with execute as owner
AFTER DELETE
AS
truncate table Customer
于 2012-11-09T06:58:31.923 回答