2012-03-25 18 views
2

Ich habe recherchiert, aber ich kann einfach nicht scheinen, es richtig zu machen. Ich habe die folgenden Tabellen:trigger in 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) 
) 

die populatuon in der ersten Tabelle, um herauszufinden, I() Bevölkerung aus den Karrieren in der gleichen Schule SUM müssen. Ich muss einen Trigger erstellen, der die Spaltenpopulation in der Tabelle school_tb aktualisiert, wenn ich die Population in career_tb aktualisiere. Bitte hilf mir. Ich hatte so etwas, aber ich kann es nicht zur Arbeit bringen.

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

Ich schätze jede Hilfe gegeben. Danke

+0

BTW Ich bin mit SQL Server 2008 R2 – itsmedavid

Antwort

3

Dies sollte Ihnen helfen. Bitte beachten Sie die Kommentare im Inneren des Auslösers.

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

hallo. Vielen Dank. für die schnelle Antwort, versucht Ihre Antwort, aber immer noch nicht funktioniert in der Auswahl vor der Auswahl der gelöschten und eingefügten Werte, sagt ungültigen Spaltennamen: S Ich schätze Ihre Antwort tho. danke – itsmedavid

+0

Ich habe meine Antwort ein wenig geändert, bitte versuchen Sie es erneut. –

+0

Ich erhalte das jetzt Msg 8155, Ebene 16, Status 2, Prozedur updatePopulation, Zeile 30 Für die Spalte 2 von 'a' wurde kein Spaltenname angegeben. Msg 207, Ebene 16, Status 1, Prozedur updatePopulation, Zeile 32 Ungültiger Spaltenname 'carrerPopulation'. Msg 207, Ebene 16, Status 1, Prozedur updatePopulation, Zeile 19 Ungültiger Spaltenname '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

Ich habe versucht, die codierte, hat nicht funktioniert entweder es sagt falsche Syntax in der Nähe 'nach' versuchte es ausziehen, und es sagt mir 'das Objekt career_tb existiert nicht oder ist ungültig (und es existiert) danke für die schnelle Antwort ich schätzen es – itsmedavid

+0

hallo. Ich habe den folgenden Code zu Ihrer Antwort hinzugefügt: 'Wenn update (poblacion)' und es mir erlaubt, den Trigger zu erstellen, aber es aktualisiert den Wert 'schoolPopulation' mit einer verrückten Zahl. zum Beispiel -9990, als ich eine Karriere auf 1000 careerPopulation – itsmedavid

+0

@itsmedavid Korrigiert, und ich denke, Sie sollten die 'If update (Bevölkerung) 'abziehen - oder überprüfen, ob es sicherlich auf Löschungen funktioniert. –