ALTER TRIGGER是否也启用了禁用的触发器?

时间:2013-06-06 18:32:09

标签: sql-server-2008 tsql

使用SQL Server和触发器,只是经历了一些非常奇怪的事情(对我来说)。详情如下 - 不确定哪些是相关的,所以我只是列出(如果我错过了什么,请问):

  • 触发器类型:INSTEAD OF INSERT
  • 它是表格中唯一的触发器
  • 有问题的数据库(来自现有的数据库)被复制了触发器 - 我没有执行此副本(因此我不知道使用了什么方法)。
  • 复制的数据库表现在有了新的列,带有约束 - 大多数(如果不是全部的话)只是NOT NULL
  • 触发器在我执行之前从未更改过 - 没有说明带有约束的新列

好的,所以这里是:似乎触发NEVER被调用,直到我 ALTERED 它(并开始导致问题所有这些都是“预期的行为”,因为我现在可以看到发生了什么)。

  • 因为(新)数据库表有新的列具有NOT NULL约束原始触发器(INSERT)没有考虑到这一点,INSERT失败按预期 < / LI>
  • 但是,在我更改触发器之前,INSERT 成功 !!再次注意,这个触发器没有考虑到新的列...即使我的ALTER仍然没有考虑到它们(我的错误) - 所以它不像我通过我的ALTER动作“纠正”任何东西。但是,之前(INSERT成功意外)和我的ALTER TRIGGER(INSERT失败为预期)之后的结果/行为的差异令人困惑....

我无法找到任何说明 ALTERING 触发器将“启用它”的资源 - 假设它已被禁用 - 这是我能理解它的唯一方法所有...

所以似乎有一些与触发器有关的数据库副本(ing)?为什么(或者更确切地说)ALTER触发器会突然使触发器恢复生命(没有明确地ENABLE - )?

我绝不是一名DBA,也不是一位SQL大师,所以如果它显而易见,我可以被置于耻辱的大厅里......

1 个答案:

答案 0 :(得分:3)

好吧,我也无法在文档中找到它,但似乎ALTER触发器确实启用了它:

create table dbo.t (col1 int)
go

create trigger tr on dbo.t instead of insert as insert into dbo.t values(1)
go

disable trigger tr on dbo.t
go

-- returns 1
select is_disabled from sys.triggers where parent_id = object_id('dbo.t')
go

alter trigger tr on dbo.t instead of insert as insert into dbo.t values(2)
go

-- now returns 0
select is_disabled from sys.triggers where parent_id = object_id('dbo.t')
go

drop table dbo.t
go

我认为这可以解释您所看到的行为。如果我必须完全猜测,我会说ALTER TRIGGERDROP TRIGGER的(事务性)语法糖,然后是CREATE TRIGGER,因此触发器会重新启用,因为它&# 39; s实际上是重新创建的,但这是纯粹的推测。