2013-05-31 24 views
13

Sto provando a creare un trigger ogni volta dopo l'inserimento, l'aggiornamento o l'eliminazione dei dati. Il trigger per l'inserimento sta funzionando bene, ma sto avendo alcuni problemi con l'aggiornamento e l'eliminazione. Ecco dopo l'inserimento di innesco:creazione di trigger per After Insert, After Update e After Delete in SQL

CREATE TRIGGER trgAfterInsert ON [DR].[dbo].[Derived_Values] 
FOR INSERT 
AS 
    insert into [Main].[dbo].[Derived_Values_Test] 
      (BusinessUnit,Questions, Answer) 
    SELECT BusinessUnit,Questions, Answer 
    FROM inserted; 

Questo è quello che ho fatto per l'aggiornamento, ma mi sembra sbagliato,

CREATE TRIGGER trgAfterUpdate ON [DR].[dbo].[Derived_Values] 
FOR UPDATE 
AS 

Update [Main].[dbo].[Derived_Values_Test] 
set BusinessUnit = 'Updated Record -- After Update Trigger.'; 
GO 

Come si crea l'aggiornamento ed eliminare i trigger? Grazie.

+1

La sintassi per la loro creazione è esattamente come per il grilletto 'INSERT' eccezione con 'FOR UPDATE' /' FOR DELETE' Che problema esatto stai avendo? Cosa dovrebbero fare i trigger 'UPDATE' e' DELETE'? –

+0

voglio semplicemente aggiornarlo quando BusinessUnit viene aggiornato, in pratica voglio che funzioni allo stesso modo del trigger Insert. – moe

+0

Stai solo cercando di mantenere '[Main]. [Dbo]. [Derived_Values_Test]' esattamente sincronizzato con '[DR]. [Dbo]. [Derived_Values]'? –

risposta

11

(Aggiornamento: trascurato un guasto in materia, ho corretto)

(Update2: ho scritto a memoria il codice avvitato, riparato)

(Update3: controllare SQLFiddle)

create table Derived_Values 
    (
    BusinessUnit nvarchar(100) not null 
    ,Questions nvarchar(100) not null 
    ,Answer nvarchar(100) 
    ) 

go 

ALTER TABLE Derived_Values ADD CONSTRAINT PK_Derived_Values 
PRIMARY KEY CLUSTERED (BusinessUnit, Questions); 

create table Derived_Values_Test 
    (
    BusinessUnit nvarchar(150) 
    ,Questions nvarchar(100) 
    ,Answer nvarchar(100) 
    ) 

go 

CREATE TRIGGER trgAfterUpdate ON [Derived_Values] 
FOR UPDATE 
AS 
begin 
    declare @BusinessUnit nvarchar(50) 
    set @BusinessUnit = 'Updated Record -- After Update Trigger.' 

    insert into 
     [Derived_Values_Test] 
     --(BusinessUnit,Questions, Answer) 
    SELECT 
     @BusinessUnit + i.BusinessUnit, i.Questions, i.Answer 
    FROM 
     inserted i 
     inner join deleted d on i.BusinessUnit = d.BusinessUnit 
end 

go 

CREATE TRIGGER trgAfterDelete ON [Derived_Values] 
FOR UPDATE 
AS 
begin 
    declare @BusinessUnit nvarchar(50) 
    set @BusinessUnit = 'Deleted Record -- After Delete Trigger.' 

    insert into 
     [Derived_Values_Test] 
     --(BusinessUnit,Questions, Answer) 
    SELECT 
     @BusinessUnit + d.BusinessUnit, d.Questions, d.Answer 
    FROM 
     deleted d 
end 

go 

insert Derived_Values (BusinessUnit,Questions, Answer) values ('BU1', 'Q11', 'A11') 
insert Derived_Values (BusinessUnit,Questions, Answer) values ('BU1', 'Q12', 'A12') 
insert Derived_Values (BusinessUnit,Questions, Answer) values ('BU2', 'Q21', 'A21') 
insert Derived_Values (BusinessUnit,Questions, Answer) values ('BU2', 'Q22', 'A22') 

UPDATE Derived_Values SET Answer='Updated Answers A11' from Derived_Values WHERE (BusinessUnit = 'BU1') AND (Questions = 'Q11'); 
UPDATE Derived_Values SET Answer='Updated Answers A12' from Derived_Values WHERE (BusinessUnit = 'BU1') AND (Questions = 'Q12'); 
UPDATE Derived_Values SET Answer='Updated Answers A21' from Derived_Values WHERE (BusinessUnit = 'BU2') AND (Questions = 'Q21'); 
UPDATE Derived_Values SET Answer='Updated Answers A22' from Derived_Values WHERE (BusinessUnit = 'BU2') AND (Questions = 'Q22'); 

delete Derived_Values; 

e poi:

SELECT * FROM Derived_Values; 
go 

select * from Derived_Values_Test; 


Record Count: 0; 

BUSINESSUNIT QUESTIONS ANSWER 
Updated Record -- After Update Trigger.BU1 Q11 Updated Answers A11 
Deleted Record -- After Delete Trigger.BU1 Q11 A11 
Updated Record -- After Update Trigger.BU1 Q12 Updated Answers A12 
Deleted Record -- After Delete Trigger.BU1 Q12 A12 
Updated Record -- After Update Trigger.BU2 Q21 Updated Answers A21 
Deleted Record -- After Delete Trigger.BU2 Q21 A21 
Updated Record -- After Update Trigger.BU2 Q22 Updated Answers A22 
Deleted Record -- After Delete Trigger.BU2 Q22 A22 

(Update4: Se si desidera sincronizzare: SQLFiddle)

create table Derived_Values 
    (
    BusinessUnit nvarchar(100) not null 
    ,Questions nvarchar(100) not null 
    ,Answer nvarchar(100) 
    ) 

go 

ALTER TABLE Derived_Values ADD CONSTRAINT PK_Derived_Values 
PRIMARY KEY CLUSTERED (BusinessUnit, Questions); 

create table Derived_Values_Test 
    (
    BusinessUnit nvarchar(150) not null 
    ,Questions nvarchar(100) not null 
    ,Answer nvarchar(100) 
    ) 

go 

ALTER TABLE Derived_Values_Test ADD CONSTRAINT PK_Derived_Values_Test 
PRIMARY KEY CLUSTERED (BusinessUnit, Questions); 

CREATE TRIGGER trgAfterInsert ON [Derived_Values] 
FOR INSERT 
AS 
begin 
    insert 
     [Derived_Values_Test] 
     (BusinessUnit,Questions,Answer) 
    SELECT 
     i.BusinessUnit, i.Questions, i.Answer 
    FROM 
     inserted i 
end 

go 


CREATE TRIGGER trgAfterUpdate ON [Derived_Values] 
FOR UPDATE 
AS 
begin 
    declare @BusinessUnit nvarchar(50) 
    set @BusinessUnit = 'Updated Record -- After Update Trigger.' 

    update 
     [Derived_Values_Test] 
    set 
     --BusinessUnit = i.BusinessUnit 
     --,Questions = i.Questions 
     Answer = i.Answer 
    from 
     [Derived_Values] 
     inner join inserted i 
    on 
     [Derived_Values].BusinessUnit = i.BusinessUnit 
     and 
     [Derived_Values].Questions = i.Questions 
end 

go 

CREATE TRIGGER trgAfterDelete ON [Derived_Values] 
FOR DELETE 
AS 
begin 
    delete 
     [Derived_Values_Test] 
    from 
     [Derived_Values_Test] 
     inner join deleted d 
    on 
     [Derived_Values_Test].BusinessUnit = d.BusinessUnit 
     and 
     [Derived_Values_Test].Questions = d.Questions 
end 

go 

insert Derived_Values (BusinessUnit,Questions, Answer) values ('BU1', 'Q11', 'A11') 
insert Derived_Values (BusinessUnit,Questions, Answer) values ('BU1', 'Q12', 'A12') 
insert Derived_Values (BusinessUnit,Questions, Answer) values ('BU2', 'Q21', 'A21') 
insert Derived_Values (BusinessUnit,Questions, Answer) values ('BU2', 'Q22', 'A22') 

UPDATE Derived_Values SET Answer='Updated Answers A11' from Derived_Values WHERE (BusinessUnit = 'BU1') AND (Questions = 'Q11'); 
UPDATE Derived_Values SET Answer='Updated Answers A12' from Derived_Values WHERE (BusinessUnit = 'BU1') AND (Questions = 'Q12'); 
UPDATE Derived_Values SET Answer='Updated Answers A21' from Derived_Values WHERE (BusinessUnit = 'BU2') AND (Questions = 'Q21'); 
UPDATE Derived_Values SET Answer='Updated Answers A22' from Derived_Values WHERE (BusinessUnit = 'BU2') AND (Questions = 'Q22'); 

--delete Derived_Values; 

E poi:

SELECT * FROM Derived_Values; 
go 

select * from Derived_Values_Test; 


BUSINESSUNIT QUESTIONS ANSWER 
BU1 Q11 Updated Answers A11 
BU1 Q12 Updated Answers A12 
BU2 Q21 Updated Answers A21 
BU2 Q22 Updated Answers A22 

BUSINESSUNIT QUESTIONS ANSWER 
BU1 Q11 Updated Answers A11 
BU1 Q12 Updated Answers A12 
BU2 Q21 Updated Answers A21 
BU2 Q22 Updated Answers A22