2014-01-15 16 views
0

我有一個觸發器,當一個表上有一個更新,插入或刪除,這個表通過PK/FK 1對1關係連接到另一個表。sql server - 觸發從2個表中複製行

當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等)

+0

當你插入tableA時,你真的想加入tableB嗎?什麼是table5和jobdtl?此外,INSERTED/DELETED表可能包含多個記錄... –

回答

1

要在觸發器中運行多個語句,請將語句括在BEGIN END塊中。

您可以爲特定事件定義多個觸發器。

要引用插入/更新的數據,請使用「插入的」僞表。對於刪除的行,使用「已刪除」僞表。

從您的問題中不清楚您是要插入到TableA/TableB還是這些是定義觸發器的表。 (SELECT語句缺少一個from子句)

+0

我已更新實際腳本,我希望它是有道理的。 – whoisearth

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 

這只是示例查詢的邏輯,我希望你能理解它。

+0

這將無法正常工作,因爲我需要將2個表加載到2個副本表中,而不是加入1個表中。 – whoisearth