none
请问MSSQL2000的触发器和MSSQL2008R2的触发器有什么不同? RRS feed

  • 问题

  • 原来一直使用MSSQL2000,触发器使用非常正常,但升级到2008R2后,触发器似乎不工作,但语句检查分析没有任何问题,这个触发器主要是用于update多个表的相关字段,例如更改一个员工的工号,会涉及到多个不同的表的相同字段更新。

    返回使用MSSQL2000,触发器正常(即更改工号)所有相关数据表都更新了。再用2008R2 疑问依然,数据表没有更新。

    如需 触发器完整脚本请PM我,因为实在是太长太多了。

    以下为简化的2008R2触发器脚本:

    USE  “数据库名”
    GO
    /****** Object:  Trigger [dbo].[UpdateEmpNo]    Script Date: 07/04/2012 14:44:48 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- Batch submitted through debugger: SQLQuery1.sql|7|0|C:\Users\Administrator\AppData\Local\Temp\1\~vs6B79.sql
      ALTER TRIGGER [dbo].[UpdateEmpNo] ON [dbo].[Employee] 
      FOR UPDATE 
      AS 
      declare @empno varchar(20), @NewEmpNo varchar(20) 
      select @empno=(select top 1 empno from deleted) 
      select @NewEmpNo=(select top 1 EmpNo from Inserted) 
      if @empno is not null 
      if Update(empno) 
      begin 
      insert into EmpNoChangeLog (OldEmpNo, NewEmpNo, ChangeDate) values (@empno, @NewEmpNo, getdate()) 

    update AboutMoneyMaster set EmpNo=inserted.EmpNo from AboutMoneyMaster,inserted,deleted where AboutMoneyMaster.EmpNo=deleted.EmpNo 

    ........

    update很多表,略过

    ........

    end 
      if Update(EmpName) 
      begin 
      if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Employee_Del]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
        insert into Employee_Del select * from Deleted 
      else 
      select * into Employee_Del from Deleted 
      end 

    -------------------------------------------------------------------------------------------------------------------------------------

    以下为sql2000的触发器简化脚本:

    CREATE TRIGGER UpdateEmpNo ON dbo.Employee 
      FOR UPDATE 
      AS 
      declare @empno varchar(20), @NewEmpNo varchar(20) 
      select @empno=(select top 1 empno from deleted) 
      select @NewEmpNo=(select top 1 EmpNo from Inserted) 
      if @empno is not null 
      if Update(empno) 
      begin 

     insert into EmpNoChangeLog (OldEmpNo, NewEmpNo, ChangeDate) values (@empno, @NewEmpNo, getdate()) 

    update AboutMoneyMaster set EmpNo=inserted.EmpNo from AboutMoneyMaster,inserted,deleted where AboutMoneyMaster.EmpNo=deleted.EmpNo 

    ........

    update很多表,略过

    ........

    end 
      if Update(EmpName) 
      begin 
      if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Employee_Del]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
        insert into Employee_Del select * from Deleted 
      else 
      select * into Employee_Del from Deleted 
      end 

    将sql2000的触发器脚本复制到2008R2创建,就会转化为2008R2的触发器脚本格式,也就是开头那部分不一样而已。

    网上有人说是权限问题,但不知道如何设置?或者是其他问题导致。请高人指点迷津。

    2012年7月4日 8:24

答案

  • 另外,如果你的数据变更是由触发器导致的,那就形成了触发器嵌套(或递归)

    这个受服务器级选项  nested triggers 和数据库级选项 RECURSIVE_TRIGGERS 的影响,具体的请参考联机帮助上关于这两个选项的说明

    这个值得试试,谢谢你,不好意思,现在才登陆看见你的答复。

    -------------------------------------------------------------

    开始我认为 触发器嵌套的开启是没有问题,原来要关掉才行,问题已经解决了。谢谢各位的帮助。

    2012年7月4日 13:56

全部回复

  • 查查  sys.triggers 中你的触发器对应的那行(where name = '你的触发器名'), 看看 is_disabled 列是否为1,是话,表示你的触发器是禁用的,自然不会触发
    2012年7月4日 8:54
  • 另外,如果你的数据变更是由触发器导致的,那就形成了触发器嵌套(或递归)

    这个受服务器级选项  nested triggers 和数据库级选项 RECURSIVE_TRIGGERS 的影响,具体的请参考联机帮助上关于这两个选项的说明

    2012年7月4日 9:35
  • 查查  sys.triggers 中你的触发器对应的那行(where name = '你的触发器名'), 看看 is_disabled 列是否为1,是话,表示你的触发器是禁用的,自然不会触发
    这个我是在表的触发器文件夹看到是禁用的(红色下箭头图标表示),已经启用过,问题依旧。
    2012年7月4日 13:55
  • 另外,如果你的数据变更是由触发器导致的,那就形成了触发器嵌套(或递归)

    这个受服务器级选项  nested triggers 和数据库级选项 RECURSIVE_TRIGGERS 的影响,具体的请参考联机帮助上关于这两个选项的说明

    这个值得试试,谢谢你,不好意思,现在才登陆看见你的答复。

    -------------------------------------------------------------

    开始我认为 触发器嵌套的开启是没有问题,原来要关掉才行,问题已经解决了。谢谢各位的帮助。

    2012年7月4日 13:56