【问题标题】:Updates on a table must be inserted into another table必须将表上的更新插入到另一个表中
【发布时间】:2013-08-22 15:33:47
【问题描述】:

如果TABLE A 有更新,有没有办法将记录插入TABLE B

我不想使用触发器。


答案是我们可以使用OUTPUT 子句代替触发器:

USE AdventureWorks2012;
GO
IF OBJECT_ID('dbo.vw_ScrapReason','V') IS NOT NULL
    DROP VIEW dbo.vw_ScrapReason;
GO
CREATE VIEW dbo.vw_ScrapReason
AS (SELECT ScrapReasonID, Name, ModifiedDate
    FROM Production.ScrapReason);
GO
CREATE TRIGGER dbo.io_ScrapReason 
    ON dbo.vw_ScrapReason
INSTEAD OF INSERT
AS
BEGIN
--ScrapReasonID is not specified in the list of columns to be inserted 
--because it is an IDENTITY column.
    INSERT INTO Production.ScrapReason (Name, ModifiedDate)
        OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, 
               INSERTED.ModifiedDate
    SELECT Name, getdate()
    FROM inserted;
END
GO
INSERT vw_ScrapReason (ScrapReasonID, Name, ModifiedDate)
VALUES (99, N'My scrap reason','20030404');
GO

【问题讨论】:

  • 如果某些行被更新,您想在表中自动插入行,但您不想使用触发器,这是您要问的吗?
  • 看看OUTPUT
  • 如果你不想使用触发器,你想做什么来触发?
  • @Kumar,是的,可以通过触发器来完成......
  • 如果您可以更改UPDATE 查询,那么您可以使用@bummi 提到的OUTPUT 子句。如果你不能,那么你至少需要在你的选项中考虑触发器。你为什么不想使用它们?为什么在您的问题中有触发器的开头?

标签: sql sql-server tsql triggers sql-server-2008-r2


【解决方案1】:

执行此操作的机制称为triggers

说你想这样做但不想使用触发器就像说你想看埃菲尔铁塔但你不想去法国。

我想,如果您可以确保所有数据更新都将通过该存储过程,那么您可以编写一个存储过程来执行触发器中的所有逻辑。 p>

【讨论】:

    【解决方案2】:

    如果您不想使用触发器,那么您将有三种选择。

    第一个是将所有插入/更新/删除包装在存储过程中。然后只使用这些存储过程进行数据修改。这实际上是我通常采取的方法。

    另一种方法是有一个定期运行以查找数据更改的进程。这实际上很难更新。插入非常容易,因为您可以添加具有默认创建日期的列,因此您可以轻松找到最近添加的内容。

    第三种方法是使用 SQL Server 更改跟踪(请参阅here)。

    【讨论】:

      【解决方案3】:

      您可以创建一个存储过程来执行表 A 中的更新和表 B 中的插入

      CREATE PROCEDURE proc_name
          @id
          @param1
      AS
      BEGIN
          update tableA
          set field1 = @param1
          where ID = @id
      
          insert into tableB(field1)
          values(@param1)
      
      END
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-15
        • 2018-03-10
        • 1970-01-01
        • 2018-04-04
        • 2012-05-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多