删除表上的SQL Server DDL触发器

时间:2014-03-10 22:06:42

标签: sql-server tsql triggers ddl-trigger

我有一个包含几个表的数据库:tab1,tab2,tab3。如何在drop table 上仅为tab2 创建DDL触发器(不适用于tab1和tab3)。调用drop tab2时,我需要更新此表中的值,但不要删除tab2。我怎样才能做到这一点?我发现了这个,但不明白它是如何工作的:

create trigger trDatabse_OnDropTable
on database
for drop_table
as
begin
 set nocount on;
 select
  'Table dropped: ' +
  quotename(eventdata().value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname')) + N'.' +
  quotename(eventdata().value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname'));
end;

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以使用ddl trigger阻止删除表。类似的东西:

CREATE TRIGGER drop_safe 
ON DATABASE 
FOR DROP_TABLE 
AS 
   PRINT 'You must disable Trigger "drop_safe" to drop table!' 
   ROLLBACK
;

要仅阻止在指定表上删除,您必须仅在该特殊情况下查看eventdata()和ROLLBACK。

答案 1 :(得分:1)

在本文DDL Triggers中,您会发现没有像DML触发器那样的INSTEAD OF DDL触发器,因此您无法阻止丢弃并执行您自己的命令:

  

DDL仅在触发它们的DDL语句触发后触发   跑。 DDL触发器不能用作INSTEAD OF触发器。 DDL触发器   不要响应影响本地或全球的事件而触发   临时表和存储过程。

您发布的这段代码用于记录DROP TABLE事件。 eventdata()包含XML,其中包含有关事件的一些信息:LoginName,ObjectName,TSQLCommand,PostTime等等。

答案 2 :(得分:1)

Students