当在通过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等。)
答案 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
这只是带有逻辑的示例查询,我希望您理解它。