2012-05-22 28 views
0

我一直在读触发器,我似乎没有找到一个例子,处理我的情况。我的情况很不幸。以前的DBA在我们的数据库中分散了冗余数据。执行触发器;更新另一个字段

在我的organiz表中更改公司名称后,我想更新多个其他表中的公司名称。我有这个,但它似乎并没有工作:

CREATE TRIGGER updOrgNameTrigger 
ON organiz 
AFTER UPDATE 
AS 

IF UPDATE(Org_Name_1) 
BEGIN 
    DECLARE @org_name varchar(256) 
    SET @org_name = (select Org_Name_1 from organiz) 
    UPDATE other_table set Org_Name_1 = @org_name 
    UPDATE the_other_table set Org_name_1 = @org_name 
END 

是我想要做的可能吗?

+0

这些表是如何关联的?你真的打算更新其他两个表中的所有行吗?三张桌子每张桌子只有一排吗?如果是这样,我会放弃其他两个表,并创建同义词或视图。 –

+0

@AaronBertrand'organiz'具有'org_id'的主键。 'other_table'和'the_other_table'都具有'org_id'作为FK。 – etm124

回答

1

您当前的触发器假定更新只能影响单个行;它还打算使用源表中的任意值更新其他两个表中的每一行(不一定是已更新的行!)。您需要使用inserted伪表来标识触发触发器的行并为Org_Name_1列提取新值。这个版本如何:

CREATE TRIGGER dbo.updOrgNameTrigger 
ON dbo.organiz 
AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    UPDATE o SET Org_Name_1 = i.Org_Name_1 
     FROM dbo.other_table AS o 
     INNER JOIN inserted AS i 
     ON o.org_id = i.org_id; 

    UPDATE o2 SET Org_Name_1 = i.Org_Name_1 
     FROM dbo.the_other_table AS o2 
     INNER JOIN inserted AS i 
     ON o2.org_id = i.org_id; 
END 
GO 
+0

谢谢Aaron,我不确定如何引用插入的伪表,并愚蠢地没有指定要更新的值。 – etm124

相关问题