我正在寻找在MS SQL Server中检查触发器是否存在的最具可移植性方法。它需要在SQL Server 2000、2005上工作,并最好在2008上也能工作。
信息似乎不在INFORMATION_SCHEMA中,但如果在那里某处存在,我更愿意从那里使用它。
我知道这种方法:
if exists (
select * from dbo.sysobjects
where name = 'MyTrigger'
and OBJECTPROPERTY(id, 'IsTrigger') = 1
)
begin
end
但我不确定它是否适用于所有SQL Server版本。
select * from sys.triggers where name = 'MyTrigger'
无法正常工作,但是 wgw 的IF OBJECTPROPERTY(OBJECT_ID('{your_trigger}'), 'IsTrigger') = 1
可以正常工作。我使用的是 MSSQL 2008 R2。 - Jakub Januszkiewiczsys.triggers
总是显示当前数据库中的触发器 - 它不会显示来自所有数据库的所有触发器... - marc_ssys.triggers
中的name
列只是一个名称(没有模式名称),而OBJECT_ID('...')
期望一个带有模式限定符的名称(至少如果模式是非默认的,如果我理解得正确的话)。所以当我将我的工作OBJECT_ID('MySchema.MyTrigger')
复制到select * from sys.triggers
时,它不起作用。仅按“ MyTrigger”过滤可以正常工作。 - Jakub Januszkiewiczsys.tables
替换为sys.views
。 - gotqn