<b> admin </b>阻止自己丢弃特定的表格?

时间:2012-11-09 06:48:37

标签: sql-server-2008

admin 如何阻止自己删除或截断特定的表,因为有时会意外地截断或删除表,因此查看不是一个好主意。如果我创建一个触发器,它将在db中的所有表中实现。我只是想在sql server中的特定表中实现它?

3 个答案:

答案 0 :(得分:0)

只需删除特殊管理员的权限目录即可。并创建第二个用户,该用户具有执行此类危险任务的权限。

另请参阅GRANT and REVOKE SQL命令。

答案 1 :(得分:0)

请为拥有所有权限的superadmin创建用户并创建触发器:

CREATE TRIGGER reminder2
ON Customer
with execute as owner
AFTER  DELETE 
AS
  truncate table Customer

答案 2 :(得分: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

这可能会导致其他一些问题,因此请在使用前进行检查。