Sql server 我需要构建一个触发器来执行复杂的插入任务

Sql server 我需要构建一个触发器来执行复杂的插入任务,sql-server,Sql Server,编辑这是从原始问题展开的 我需要一个触发器来将某些信息发送到一个表,以便传输到另一个组。然而,只有C4在T2上确定的特定类别的数据在更新时必须传输 create trigger Trig on T2 after Insert, update, delete if update(C3) --DETERMINES THAT RECORD HAS BEEN UPDATED IN A MANNER THAT NEEDS TO BE TRANSFERRED beg

编辑这是从原始问题展开的

我需要一个触发器来将某些信息发送到一个表,以便传输到另一个组。然而,只有C4在T2上确定的特定类别的数据在更新时必须传输

create trigger Trig on T2
after Insert, update, delete
if update(C3) --DETERMINES THAT RECORD HAS BEEN UPDATED IN A MANNER THAT NEEDS TO BE  
              TRANSFERRED     
begin
if C4 != 9 return --DETERMINES IF RECORD NEEDS TO BE TRANSFERRED
else
insert P1 --BEGINS PUTTING INFORMATION INTO THE ABLE THAT IS TRANSFERRED
(C1, C2, C3)
select T1.C2, T1.C3, T2.C3 --INFORMATION THAT NEEDS TO BE TRANSFERRED
FROM T1, T2
WHERE T1.C1 = T2.C2 --T1.C1 IS A UNIQUE PRIMARY KEY THAT CONNECTS ROW IN T1 TO ROW
                      IN T2
END
GO
这是完整的测试代码。实际代码将涉及更多不同名称的列。所有表数据类型都相同。 谢谢。

您可以访问触发器中插入的表以获取c4列的值,但如果您能向我们提供有关您试图解决的问题的更多信息,或许我们可以建议一种比触发器更好的替代方法

DML触发器语句使用两个特殊的表:删除的表和 插入的表。SQL Server自动创建和管理 这些桌子。您可以使用这些临时的内存驻留表来 测试某些数据修改的效果并设置条件 用于DML触发操作。不能直接修改中的数据 表或在上执行数据定义语言DDL操作 表,例如创建索引

在DML触发器中,插入和删除的表主要用于 执行以下操作:

扩展表之间的引用完整性。 在视图基础的基表中插入或更新数据。 测试错误并根据错误采取措施。 查找数据修改前后表状态的差异,并根据该差异采取措施。
在SQL Server中,您还需要知道触发器处理大量数据,因此您必须在触发器中插入其他内容以处理插入或删除的多个记录。如果将任何内容设置为标量变量,则如果插入/更新/删除多个RCORD,则触发器可能无法工作。Alsways使用批处理中的多条记录以及单个记录测试触发器。幸运的是,一次只能插入或更新一条记录。您不能在触发器中进行此假设。有时会从应用程序以外的地方插入多条记录。假设只有一个记录是不负责任的。如果不考虑多个记录插入,可以创建可怕的数据完整性混乱!使用隐式联接也是一种非常糟糕的做法,因为您需要使用插入的表而不是基表,所以您的联接是错误的。你为什么要用20年前用更好的技术取代的东西。如果Ccode有那么旧,你会这么做吗?我在帖子中添加了完整的触发目的。谢谢你的帮助。我确实需要转移删除的记录。插入到新表中的一个字段将作为其值输入“删除”,因此表P1的接收者将删除相同的记录。
create trigger Trig on T2
after insert, update, delete
as
 -- So that @@rowcount does not get affected by trigger code
    set NoCount on
 -- If c3 column participated in update (it most certainly did in insert)
    if update(C3)
    begin
     -- Insert or update triggered this operation
        if exists (select *
                     from Inserted)
        begin
            insert into P1 (C1, C2, C3)
            select T1.C2, T1.C3, T2.C3 --INFORMATION THAT NEEDS TO BE TRANSFERRED
            from T1
         -- Inserted is a pseudotable holding inserted/updated data
            inner join inserted T2
            on T1.C1 = T2.C2
            where T2.C4 <> 9 --DETERMINES IF RECORD NEEDS TO BE TRANSFERRED
        end
        else
     -- Separate insert for deleted records
     -- To simplify inserting additional info for deleted records only
        begin
            insert into P1 (C1, C2, C3)
            select T1.C2, T1.C3, T2.C3 --INFORMATION THAT NEEDS TO BE TRANSFERRED
            from T1
         -- deleted is a pseudotable holding deleted/updated data
            inner join deleted T2
            on T1.C1 = T2.C2
            where T2.C4 <> 9 --DETERMINES IF RECORD NEEDS TO BE TRANSFERRED
        end
    end