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
参考