【问题标题】:hov create ms sql Trigger on many rows (like oracle FOR EACH ROW)hov create ms sql 在多行上触发(如 oracle FOR EACH ROW)
【发布时间】:2021-02-21 09:05:07
【问题描述】:

在 oracle 中我创建触发器没有问题,但在 tsql 中我遇到了一个大问题:)

我有一份工作,他在一个表格中插入行:

SELECT wa.IdAnkiety      
     ,wa.IdUsterkiService
      ,wa.LiczbaGlosowTak
       ,wa.LiczbaGlosowNie   FROM [SERV-SQL01].[DomTransfer].[dbo].[D5Cts_WynikiAnkiet] wa   where not
 exists (select wy.IdUsterkiService     from dba.DOM_WyAnkiet wy 
    where   wy.IdUsterkiService=wa.IdUsterkiService     and
 wy.IdAnkiety=wa.IdAnkiety)```

And on this: dba.DOM_WyAnkiet tble I heave a trigger

ALTER trigger [dba].[wyankiet]
on [dba].[DOM_WyAnkiet] AFTER insert
AS
begin

declare @DefectActId uniqueidentifier,
        @tak int,
        @nie int;

    select @DefectActId=IdUsterkiService, @tak=tak, @nie=nie from inserted;

    if @tak>@nie
        update dba.DefectAct set status='49A86504-2E7D-46AB-A022-FC4C3C8CA853', InspectionDate=GETDATE() where DefectActId=@DefectActId;

    if @nie>@tak
        update dba.DefectAct set status='2EDA9FB2-8ED2-43AC-8C30-348D3F060CE3',InspectionDate=GETDATE() where DefectActId=@DefectActId;

    if @nie=@tak
        update dba.DefectAct set status='588B5BAA-F7CE-455D-9489-B2B956949449',InspectionDate=GETDATE() where DefectActId=@DefectActId;

end

但似乎那也行不通 在 oracle 中,我添加 FOR EACH ROW 命令,上面类似的东西是有效的。

【问题讨论】:

  • inserted 是插入的行的集合,因此请将其视为行表而不是单行。
  • 阅读Bad Habits to Kick : Abusing triggers。您的 TRIGGER 假设 INSERT 仅包含 1 行;这根本不是真的。但是,您在触发器中将InspectionDate 设置为GETDATE() 似乎很奇怪;为什么不使用DEFAULT 值?

标签: sql-server tsql triggers


【解决方案1】:

处理多行插入。加入inserted 虚拟表,而不是分配标量变量。下面是一个使用CASE 表达式的基于集合的技术的示例(未经测试):

ALTER trigger [dba].[wyankiet]
    ON[dba].[DOM_WyAnkiet] AFTER INSERT
AS
UPDATE da
    set status=
        CASE 
            WHEN i.tak>i.nie THEN '49A86504-2E7D-46AB-A022-FC4C3C8CA853'
            WHEN i.nie>i.tak THEN '2EDA9FB2-8ED2-43AC-8C30-348D3F060CE3'
            WHEN i.nie=i.tak THEN '588B5BAA-F7CE-455D-9489-B2B956949449'
        END
    , InspectionDate=GETDATE()
FROM dba.DefectAct AS da
JOIN inserted AS i ON i.DefectActId=da.DefectActId;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 2013-01-07
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    相关资源
    最近更新 更多