Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 执行触发器;更新另一个字段_Sql_Sql Server_Tsql_Sql Server 2005 - Fatal编程技术网

Sql 执行触发器;更新另一个字段

Sql 执行触发器;更新另一个字段,sql,sql-server,tsql,sql-server-2005,Sql,Sql Server,Tsql,Sql Server 2005,我一直在阅读触发器,但我似乎没有找到一个例子来处理我的情况。我的处境很不幸。以前的DBA将冗余数据分散在整个数据库中 一旦在我的organiz表中更改了公司名称,我想在多个其他表中更新公司名称。我有这个,但似乎不起作用: CREATE TRIGGER updOrgNameTrigger ON organiz AFTER UPDATE AS IF UPDATE(Org_Name_1) BEGIN DECLARE @org_name varchar(256) SET @org_na

我一直在阅读触发器,但我似乎没有找到一个例子来处理我的情况。我的处境很不幸。以前的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

我想做的是可能的吗?

您当前的触发器假设更新只能影响一行;它还打算使用源表中的任意值(不一定是更新的行!)更新其他两个表中的每一行。您需要使用
inserted
伪表来标识触发触发器的行,并为
Org\u Name\u 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

这些表格有什么关系?您真的打算更新其他两个表中的所有行吗?这三张桌子每一张只有一行吗?如果是这样,我会删除另外两个表,转而创建同义词或视图。@AaronBertrand
organiz
的主键为
org\u id
other\u table
other\u table
都有
org\u id
作为FK。感谢Aaron,我不确定如何引用插入的伪表,愚蠢地没有指定要更新的值。