2012-03-25 2 views
2

저는 조사 중이지만 제대로 이해할 수 없습니다. 나는 다음과 같은 테이블이 있습니다SQL Server 2008의 트리거

create table school_tb 
(idSchool int identity primary key, 
nameSchool varchar(100), 
schoolPopulation int 
) 

create table career_tb 
(idCareer int identity primary key, 
nameCareer  varchar(100), 
carrerPopulation int, 
numberClasses int, 
idSchool int foreign key references school_tb(idSchool) 
) 

내가 같은 학교에 경력에서() 인구 합계해야 할 첫 번째 테이블에서 populatuon을 찾을 수 있습니다. career_tb에서 채우기를 업데이트 할 때 school_tb 테이블의 열 채우기를 업데이트하는 트리거를 만들어야합니다. 도와주세요. 나는 이것과 비슷한 것을 가지고 있었지만 작동시키지 못했습니다.

--create trigger updatePopulation 
--on career_tb 
--for update as 
--if UPDATE(carrerPopulation) 
--update school_tb set schoolPopulation =(SELECT add(carrerPopulation) 
--         from career_tb 
--         where idSchool=(SELECT idSchool 
--         from career_tb 
--         where [email protected]) 
--         ) 
--go 

나는 어떤 도움을 주셔서 감사합니다. 감사합니다

+0

BTW 내가 SQL 서버 2008 R2 – itsmedavid

답변

3

이것은 당신을 도울 것입니다. 방아쇠의 몸체 안에있는 주석을보십시오.

create trigger updatePopulation 
on career_tb 
-- to update sum even if carreer gets deleted or inserted 
after insert, update, delete 
as 
-- to avoid trigger messing up rows affected 
    set nocount on 

    if UPDATE(carrerPopulation) 
    begin 
    -- update sum by difference between previous and current state of one record in career 
     update school_tb 
     set schoolPopulation = schoolPopulation + difference 
     from school_tb 
     -- derived table sums all the careers changed in one go 
     inner join 
     (
     -- sum all values from careers by school 
      select idSchool, sum (carrerPopulation) difference 
      from 
      (
       -- change sign of previous values 
       select deleted.idSchool, -deleted.carrerPopulation carrerPopulation 
        from deleted 
       union all 
       -- + current values 
       select inserted.idSchool, inserted.carrerPopulation 
        from inserted 
      ) a 
       group by idSchool 
      -- Skip update in case of no change 
       having sum (carrerPopulation) <> 0 
     ) a 
      on school_tb.idSchool = a.idSchool 
    end 
+0

안녕을 사용하고 있습니다. 감사. 빠른 답변을 위해 귀하의 답변을 시도했지만 여전히 삭제되지 않고 삽입 된 값을 선택하기 전에 선택 항목에서 작동하지 않습니다. 유효하지 않은 열 이름을 말하고 있습니다. S 답변을 정말 고맙습니다. 고마워요. – itsmedavid

+0

제 응답이 조금 바뀌 었습니다. 다시 시도하십시오. –

+0

지금이 메시지가 나타납니다. 8155, 수준 16, 상태 2, 프로 시저 updatePopulation, 줄 30 'a'의 열 2에 대해 열 이름이 지정되지 않았습니다. 메시지 167, 수준 16, 상태 1, 프로 시저 updatePopulation, 줄 32 'carrerPopulation'열 이름이 잘못되었습니다. 메시지 19, 수준 16, 상태 1, 프로 시저 updatePopulation, 줄 19 'carrerPopulation'열 이름이 잘못되었습니다. – itsmedavid

2
CREATE TRIGGER name ON career_tb 
AFTER INSERT, UPDATE, DELETE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    MERGE school_tb T 
    USING 
    (
     SELECT idSchool, SUM(carrerPopulation) res 
     FROM 
     (
      SELECT idSchool, carrerPopulation 
      FROM INSERTED 
      UNION ALL 
      SELECT idSchool, -carrerPopulation 
      FROM DELETED 
     ) t 
     GROUP BY idSchool 
    ) S 
    ON T.idSchool = S.idSchool 
    WHEN MATCHED THEN UPDATE SET 
     schoolPopulation = T.schoolPopulation +S.res 
    ; 


END 
+0

나는 코딩을 시도했거나 잘못된 구문이 '근처에있다'라고 말하면 작동하지 않았다. 그리고 그것을 벗어 던져 보았다. 그리고 'career_tb가 존재하지 않거나 유효하지 않다. 고맙습니다. – itsmedavid

+0

안녕하세요. 다음 코드를 'Update (poblacion) 경우'로 설정하면 트리거를 만들 수 있지만 schoolPopulation 값을 미친 숫자로 업데이트하고 있습니다. 예를 들어, 한 직업을 1000 careerPopulation – itsmedavid

+0

@itsmedavid로 업데이트했을 때 -9990이 수정되었습니다.'If update (population) '를 제거해야한다고 생각하거나 삭제시 반드시 작동하는지 확인하십시오. –