2013-05-31 16 views
13

Tôi đang cố gắng tạo một trigger mỗi lần sau khi dữ liệu được chèn, cập nhật hoặc xóa. Trình kích hoạt để chèn đang hoạt động tốt nhưng tôi đang gặp một số vấn đề với Cập nhật và Xóa. Dưới đây là Sau Insert trigger:tạo trình kích hoạt cho Sau khi chèn, sau khi cập nhật và sau khi xóa trong 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; 

Đây là những gì tôi đã làm cho bản cập nhật nhưng có vẻ như sai,

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 

Làm thế nào để tôi tạo ra các bản cập nhật và xóa gây nên? Cảm ơn.

+1

Cú pháp để tạo ra chúng là chính xác theo 'INSERT' kích hoạt trừ với 'FOR UPDATE' /' FOR DELETE' Bạn đang gặp phải vấn đề gì? Trình kích hoạt 'UPDATE' và' DELETE' phải làm gì? –

+0

tôi chỉ muốn cập nhật nó khi BusinessUnit được cập nhật, về cơ bản tôi muốn nó hoạt động theo cách tương tự như trình kích hoạt Chèn. – moe

+0

Bạn chỉ đang cố gắng giữ '[Main]. [Dbo]. [Derived_Values_Test]' được đồng bộ chính xác với '[DR]. [Dbo]. [Derived_Values]'? –

Trả lời

11

(Cập nhật: bỏ qua một lỗi trong vấn đề này, tôi đã sửa chữa)

(Update2: tôi đã viết từ bộ nhớ mã hơi say lên, sửa chữa nó)

(UPDATE3: kiểm tra trên 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; 

và sau đó:

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: Nếu bạn muốn đồng bộ hóa: 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; 

Và sau đó:

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