sql server - 触发从2个表复制行

时间:2014-01-15 00:43:56

标签: sql sql-server triggers

当在通过PK / FK 1对1关系连接到另一个表的表上有更新,插入或删除时,我会调用一个触发器。

目前,当U,I或D出现时,我正在从TableA复制rowX。我希望它能同时从TableB复制rowX。

我该怎么做?

USE [Database]
GO
/****** Object:  Trigger [dbo].[archiveTable]    Script Date: 14/01/2014 3:48:08 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[archiveTable] ON [dbo].[TableA]
   AFTER INSERT,UPDATE,DELETE
AS

DECLARE @HistoryType    char(1) --"I"=insert, "U"=update, "D"=delete
DECLARE @Id INT

SET @HistoryType=NULL
SET @Id=NULL

IF EXISTS (SELECT * FROM INSERTED)
BEGIN
    IF EXISTS (SELECT * FROM DELETED)
    BEGIN
        --UPDATE
        SET @HistoryType='U'
    END
    ELSE
    BEGIN
        --INSERT
        SET @HistoryType='I'
    END
    --handle insert or update data
    INSERT INTO [database2].[dbo].[tableA]
            (column1, column2, ...)
        SET @Id=INSERTED.column5
        SELECT
            GETDATE(), @HistoryType,
            column1, column2, ...
            FROM INSERTED
            JOIN tableB ON INSERTED.column5 = table5.column1
    INSERT INTO [database2].[dbo].[tableB]
            (column1, column2, column3, ...)
        SELECT
            GETDATE(), @HistoryType,
            column1, column2, column3, ....
            FROM jobdtl WHERE column1 = INSERTED.column5


END
ELSE IF EXISTS(SELECT * FROM DELETED)
BEGIN
    --DELETE
    SET @HistoryType='D'

same as above except for delete

END

我猜我需要一个内连接或者我需要一个变量来获取@job_id所以它知道从第二个表中复制相关信息吗?

编辑 - 从它的外观我需要以某种方式使用SCOPE_IDENTITY()但是它没有采取事务的job_id它采取事务的实际ID(即1,2,3等等,而我需要它为动态,因为job_id可能是54,634,325等。)

2 个答案:

答案 0 :(得分:1)

要在触发器中运行多个语句,请将语句括在BEGIN END块中。

您可以为特定事件定义多个触发器。

要引用插入/更新的数据,请使用“inserted”伪表。对于已删除的行,请使用“已删除”伪表。

从您的问题中不清楚是否要插入TableA / TableB,或者这些是否是为其定义触发器的表。 (SELECT语句缺少from子句)

答案 1 :(得分:0)

我认为,您可以使用 UNION 子句一次从不同的表中插入两行。 我做了一个演示查询,您只需将其更改为您的查询。

create table #a
(
    id int,
    name varchar(10)
)
insert into #a
select 1,'ax'
union
select 1,'bx'

select * from #a
drop table #a

这只是带有逻辑的示例查询,我希望您理解它。