使用Oracle时,您可以创建一个禁用的触发器,在触发器主体之前指定单词DISABLE。如何在Sql Server中实现相同的效果?
答案 0 :(得分:15)
如果您确实必须创建禁用的触发器,请在事务中创建和禁用它:
begin tran
go
create trigger t_i on t after insert as begin /* trigger body */ end
go
disable trigger t_i on t
commit
go
GO是存在的,因为CREATE TRIGGER必须是批处理中的第一个语句,但根据您部署代码的方式,您可能会使它看起来有点整洁。
答案 1 :(得分:1)
我这样做的方法是执行创建和禁用,如:
EXEC('CREATE TRIGGER trigger_on_myTable ON myTable <Trigger body> ');
EXEC('DISABLE TRIGGER trigger_on_myTable ON myTable');
这允许我在没有任何GO的情况下在同一个脚本中创建和禁用。
答案 2 :(得分:0)
在管理工作室中展开表格下的触发器文件夹,然后右键单击“触发并禁用”。
DISABLE TRIGGER { [ schema_name . ] trigger_name [ ,...n ] | ALL }
ON { object_name | DATABASE | ALL SERVER } [ ; ]
MSDN:DISABLE TRIGGER (Transact-SQL)
ENABLE TRIGGER { [ schema_name . ] trigger_name [ ,...n ] | ALL }
ON { object_name | DATABASE | ALL SERVER } [ ; ]
MSDN:ENABLE TRIGGER (Transact-SQL)
sql-server-disable-all-triggers-on-a-database-disable-all-triggers-on-all-servers
答案 3 :(得分:0)
T-SQL提供了一个DISABLE TRIGGER语句来完成同样的事情。您可以在此处找到详细信息:DISABLE TRIGGER SYNTAX
答案 4 :(得分:0)
如果您更喜欢不需要事务的解决方案,但是这也消除了触发器在创建它和它被禁用的那一刻之间触发并执行其操作的可能性,那么您可以创建触发,基本上没有代码,然后禁用它,然后改变它以包括其实际的身体:
create trigger dbo.MyTrigger
on dbo.MyTable
after insert
as
declare @Foo int;
--Trigger body must have at least a statement (or an "external name") so that's why the above dummy declare.
go
disable trigger dbo.MyTrigger
on dbo.MyTable;
go
alter trigger dbo.MyTrigger
on dbo.MyTable
after insert
as
declare @Foo int;
--Remove above declare statement and insert actual trigger code here.
go