我有一个包含几个表的数据库: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;
谢谢!
答案 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