2012-05-22 2 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

현재 트리거는 업데이트가 단일 행에만 영향을 줄 수 있다고 가정합니다. 다른 두 테이블의 모든 단일 행을 원본 테이블의 임의의 값으로 업데이트하려고합니다 (반드시 업데이트 된 행과 다를 수 있습니다!). 트리거를 실행 한 행을 식별하고 Org_Name_1 열에 대한 새 값을 가져 오려면 inserted 의사 테이블을 사용해야합니다. 이 버전은 어떻습니까?

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

관련 문제