триггер в SQL Server 2008 - PullRequest
       3

триггер в SQL Server 2008

2 голосов
/ 25 марта 2012

Я занимался исследованиями, но я просто не могу понять, что это правильно. У меня есть следующие таблицы:

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)
)

чтобы узнать численность населения в первой таблице, которую я должен SUM () населения по карьере в той же школе. Мне нужно создать триггер, который будет обновлять заполнение столбца в таблице school_tb, когда я обновляю заполнение столбца в career_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 idCareer=@idCareer)
--                                  )
--go

Я ценю любую помощь, оказанную. спасибо

Ответы [ 2 ]

3 голосов
/ 25 марта 2012

Это должно помочь вам. Пожалуйста, смотрите комментарии внутри тела триггера.

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
2 голосов
/ 25 марта 2012
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
...