【问题标题】:T-SQL : create trigger to copy new columns from one table to another and increment noT-SQL:创建触发器以将新列从一个表复制到另一个表并增加 no
【发布时间】:2025-12-06 22:15:01
【问题描述】:

我正在尝试创建一个触发器,以将新添加的行从不同数据库上的一个表但在同一服务器上复制到另一个表,并增加一个仅存在于添加新行的表上的列。我不确定代码是否准确,并且希望获得有关如何改进的任何反馈。

CREATE TRIGGER AddReTncyTransStatement 
ON [DBAdmin].[dbo].[ReTncyTransStatement]
AFTER UPDATE, INSERT 
AS
BEGIN
    INSERT INTO [DBAdmin].[dbo].[ReTncyTransStatement]
                ([ORG-CODE], [TNCY-SYS-REF], [TRANS-NO], [PROGRESS-RECID])
        SELECT        
            [ORG-CODE],
            [TNCY-SYS-REF],
            [TRANS-NO],
            [ANALYSIS-CODE] ``,
            (SELECT MAX([PROGRESS-RECID]) 
             FROM [DBAdmin].[dbo].[ReTncyTransStatement]) + 1 AS RECID
        FROM            
            [SQLViewsPro2EOD].[dbo].[RE-TNCY-TRANS]
END;

【问题讨论】:

  • 此查询不会按预期工作,因为您已经在表上创建了一个 AFTER INSERT 触发器,并且您试图再次插入到触发器内的同一个表中。
  • 我可以把它改成什么来修复它?抱歉,我以前从未写过触发器。
  • 我已经发布了答案

标签: sql-server tsql triggers


【解决方案1】:

我想您有一个名为[RE-TNCY-TRANS] 的表位于[SQLViewsPro2EOD] 数据库中,另一个表[ReTncyTransStatement] 位于[DBAdmin] 数据库中。

我还想象你想在每次将记录插入[RE-TNCY-TRANS] 时插入一条记录到[ReTncyTransStatement]。因此,要实现这一点,您需要重写触发器,如下所示:

CREATE TRIGGER AddReTncyTransStatement
ON [SQLViewsPro2EOD].[dbo].[RE-TNCY-TRANS]
AFTER UPDATE, INSERT
AS
BEGIN
    INSERT INTO [DBAdmin].[dbo].[ReTncyTransStatement]
    (
        [ORG-CODE],
        [TNCY-SYS-REF],
        [TRANS-NO],
        [PROGRESS-RECID]
    )
    SELECT [ORG-CODE],
           [TNCY-SYS-REF],
           [TRANS-NO],
           ISNULL((
               SELECT MAX([PROGRESS-RECID]) FROM [DBAdmin].[dbo].[ReTncyTransStatement]
           ),0) + 1 AS RECID
    FROM Inserted;
END;

更新

我为什么使用 ISNULL 函数?

因为第一次,[DBAdmin].[dbo].[ReTncyTransStatement]表中没有记录,所以MAX([PROGRESS-RECID])为NULL。我使用ISNULL 来处理这种情况。

为什么我使用inserted

根据微软文档:

插入的表在 INSERT 期间存储受影响行的副本 和 UPDATE 语句。在插入或更新事务期间,新的 行被添加到插入的表和触发器表中。这 插入表中的行是触发器中新行的副本 表。

在这里阅读更多:https://docs.microsoft.com/en-us/sql/relational-databases/triggers/use-the-inserted-and-deleted-tables?view=sql-server-2017

【讨论】:

  • 感谢 Vahid,了解逻辑。您能解释一下为什么在 isnull 中使用以及为什么在 FROM Inserted 中使用吗?
  • @user3306489 我已经更新了答案。检查它,如果您认为它正确且有用,请将其标记为答案。
  • 感谢 Vahid,我还需要做哪些设置/开发工作才能使其正常工作?
  • @user3306489 如果我前面提到的场景是正确的,它可以正常工作
  • 我的意思是它是否会在创建后自动开始运行。感谢您的帮助!
最近更新 更多