T-SQL触发器踩坑小计

今天接到一个开发任务,一个对象更新时,同时触发另一个对象的更新。本来公司有SDK可以开发这部分,可想着这不就是个Trigger么,就直接在数据库那块写了个触发器。

  • exists (select 1 from MOCProject)是比exists (select * from MOCProject)的性能有优化的。
  • 关于变量的select语法赋值,需要注意如果查出的数据包含多行,赋值是随机的,有可能是赋值最后一行,也有可能是随机的一行。参考这个网页:select-vs-set-for-variable-assignment-in-sql-server/
  • 关于Bulk update。后来调试,SSMS怎么都能成功,测试环境怎么都不能成功。问了提供SDK相关的同事,原来Insert操作是用的Bulk Insert,默认是不能fire the trigger的。也不可能给我开Option,影响整体性能。好吧,老老实实滚回去调用SDK写代码了。
IF (object_id('tgr_update', 'TR') IS NOT NULL)
    DROP TRIGGER tgr_update
GO
CREATE TRIGGER tgr_update
  ON [dbo].[SPFData]    --触发器对象表
  FOR update -- ,insert --插入或更新时触发.
  AS
  BEGIN
    DECLARE @oldStatus varchar(20), @newStatus varchar(20), @mocid varchar(20), @obid varchar(20);
    SELECT @oldStatus = status, @obid = OBJOBID from deleted;
    SELECT @newStatus = status from inserted;
    SELECT @mocid = Name from DATAOBJ where OBID = @obid;
    IF (exists (select 1 from MOCProject where MOCID = @mocid ) AND @newstatus = '完成')
        BEGIN
            update MOCProject set status = replace(name, @oldName, @newName) where MOCID = @mocid;
            print 'succeed.';
        END
    ELSE
        print 'failed.';
  END
GO

参考

posted @ 2020-05-28 09:04  Lee.Yan  阅读(143)  评论(0编辑  收藏  举报