Sql server SQL触发器查找已删除值和插入值之间的差异

Sql server SQL触发器查找已删除值和插入值之间的差异,sql-server,sql-server-2008,tsql,sql-server-2008-r2,Sql Server,Sql Server 2008,Tsql,Sql Server 2008 R2,我们有一个应用程序,它将以以下方式工作,不能更改 前端应用程序将获取数据集中表的完整值。 我们将从前端应用程序更新表的任何列。 应用程序将只获取整个表的更新值更新值,并删除表中的所有旧值。 然后,它将在表中重新插入所有更新的数据。 我们不能再改变前端功能了 我需要获取表中已删除的值,并从Delete触发器将其放入永久临时表中。 在插入更新数据期间,Insert触发器必须将所有更新值捕获到另一个永久临时表中 CREATE TRIGGER D_NAME ON TABLE_WITH_DATA FOR

我们有一个应用程序,它将以以下方式工作,不能更改

前端应用程序将获取数据集中表的完整值。 我们将从前端应用程序更新表的任何列。 应用程序将只获取整个表的更新值更新值,并删除表中的所有旧值。 然后,它将在表中重新插入所有更新的数据。 我们不能再改变前端功能了

我需要获取表中已删除的值,并从Delete触发器将其放入永久临时表中。 在插入更新数据期间,Insert触发器必须将所有更新值捕获到另一个永久临时表中

CREATE TRIGGER D_NAME
ON TABLE_WITH_DATA
FOR DELETE
AS 
BEGIN

      INSERT INTO TEMP_DELETED_DATA
      SELECT * FROM DELETED

END;

CREATE TRIGGER I_NAME
ON TABLE_WITH_DATA
INSTEAD OF INSERT
AS 
BEGIN

   IF EXISTS (SELECT X FROM TEMP_DELETED_DATA WHERE A = (SELECT A FROM INSERTED)) --leave new inserts alone...
   BEGIN

      IF (SELECT X FROM TEMP_DELETED_DATA WHERE A = (SELECT A FROM INSERTED)) = (SELECT X FROM INSERTED)
      BEGIN
            INSERT INTO TABLE_WITH_DATA SELECT * FROM INSERTED -- X DID NOT CHANGE, INSERT AS IS   
      END
      ELSE BEGIN --X CHANGED
            DECLARE @X [type] --DATATYPE ACCORDING THE COLUMN
            --CALL YOUR FUNCTION ...
            INSERT INTO TABLE_WITH_DATA --ETC.... INSEAD OF INSERTED.X, YOU INSERT THE @X VARIABLE
      END;

   END
   ELSE BEGIN

     INSERT INTO TABLE_WITH_DATA SELECT * FROM INSERTED --NEW INSERT 

   END;

END;
然后从Insert触发器开始,我们需要比较两个表,并且只在特定列“X”的值发生变化时才需要执行某些函数ex:function X

请帮助我处理SQL 2008 R2中的删除和插入触发器

注:

表有5列 A、B、C、X、D列 A是主键。
这是一个非常糟糕的设计,但也可以。注意第二个触发器-它不是INSERT。在ELSE部分中,您必须列出所有列并使用它们的INSERTED.xxx值,X除外,在X中您将使用函数的输出

我希望TEMP_DELETED_数据表与包含数据的原始表_具有相同的列。您实际上不需要第二个临时表

CREATE TRIGGER D_NAME
ON TABLE_WITH_DATA
FOR DELETE
AS 
BEGIN

      INSERT INTO TEMP_DELETED_DATA
      SELECT * FROM DELETED

END;

CREATE TRIGGER I_NAME
ON TABLE_WITH_DATA
INSTEAD OF INSERT
AS 
BEGIN

   IF EXISTS (SELECT X FROM TEMP_DELETED_DATA WHERE A = (SELECT A FROM INSERTED)) --leave new inserts alone...
   BEGIN

      IF (SELECT X FROM TEMP_DELETED_DATA WHERE A = (SELECT A FROM INSERTED)) = (SELECT X FROM INSERTED)
      BEGIN
            INSERT INTO TABLE_WITH_DATA SELECT * FROM INSERTED -- X DID NOT CHANGE, INSERT AS IS   
      END
      ELSE BEGIN --X CHANGED
            DECLARE @X [type] --DATATYPE ACCORDING THE COLUMN
            --CALL YOUR FUNCTION ...
            INSERT INTO TABLE_WITH_DATA --ETC.... INSEAD OF INSERTED.X, YOU INSERT THE @X VARIABLE
      END;

   END
   ELSE BEGIN

     INSERT INTO TABLE_WITH_DATA SELECT * FROM INSERTED --NEW INSERT 

   END;

END;
我希望一次只能插入一行。如果没有,则需要进行相应调整


顺便说一句:如果重新插入后不再需要,还可以修改INSTEAD OF触发器,以从临时表中清除相应的行。

这看起来不会处理插入多于一行的插入(如果有效的话)。它不会处理插入多于一行的插入,但它可以相应地改变。原理是一样的。@HABO如果它真的起作用,你认为你写的有什么错?也许我忽略了什么…在代替触发器中,你有两个插入的引用。由于未从“插入”中选择任何内容,因此无法引用“插入”中的列。从临时删除数据中选择X,其中A=插入。A不起作用,但从临时删除数据中选择X,其中A在选择中插入。从插入将起作用。您计划如何管理永久临时表的内容?在最后的处理步骤之后,是否应该有什么东西来清理它们?是否需要在触发器内部调用函数X?否则,您可以使用内置的更改数据跟踪,然后在计时器上对更改的数据调用函数X?