1

tbl_repair_visit.TENANTSATISFACTION = 'Poor'更新時に実行されるトリガーが添付されています。

エンジニアの名前を変更すると、エンジニアの列が更新され、次の場合にトリガーが再度実行されるという問題があります。TENANTSATISFACTION = 'Poor'

TENANTSATISFACTION = 'Poor'列が更新された場合にのみ実行し、他のすべての列の更新を無視するように設定するにはどうすればよいですか

ALTER TRIGGER [dbo].[tr_CustomerSatisfactionAlertRepair] 
    ON [dbo].[tbl_repair_visit] 
AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;
    INSERT alertmessagedata (TypeID, Contract, Address, ORDERID, 
                ENGINEERS, Sent, DateAdded)
    SELECT '5', tbl_property.contract, tbl_property.fulladdress, 
            tbl_repair_visit.orderid, tbl_repair_visit.engineer, 
            0, GETDATE()
    FROM TBL_REPAIR_VISIT 
    INNER JOIN
        INSERTED X ON TBL_REPAIR_VISIT.VISITID = X.VISITID 
    INNER JOIN 
        TBL_PROPERTY ON TBL_REPAIR_VISIT.PROPREF = TBL_PROPERTY.PROPREF
    WHERE tbl_repair_visit.TENANTSATISFACTION = 'Poor'
END
4

5 に答える 5

5

更新トリガーでは、列が更新されているかどうかを確認できます。

IF UPDATE(TENANTSATISFACTION) BEGIN .... END

于 2009-02-03T11:42:11.003 に答える
0

ネストされたトリガーオプションで何かできませんか?
(トリガーによって他のトリガーが起動されないように、そのオプションをオフに設定します)

または、AFTER トリガーの代わりに INSTEAD OF トリガーを作成することもできます。もちろん、INSTEAD OF トリガーでは、追加のロジックの隣に、テーブルへの実際の更新または挿入を行う UPDATE (または挿入) ステートメントも記述する必要があります。

于 2009-02-03T12:09:36.877 に答える
0

レコードの新しいバージョンを古いバージョンから左に結合します。結合されたテーブル (挿入されたテーブル) に null 値がある場合は、変更を検出するフィールドが変更されたことを意味します。

create table family
(
id int not null identity(1,1),
name varchar(100) not null,
age int not null
);


insert into family(name,age) values('Michael', 32);
insert into family(name,age) values('Matthew', 23);



create trigger TrigUpdOnFamily on family
for update
as

    if exists
        (
        select * from deleted 
        left join inserted on inserted.id = deleted.id    

        -- put the fields to detect here...
        and inserted.age = deleted.age
            -- ...detections
        where inserted.age is null) begin    

        -- detect important fields
        print 'age change';

    end
    else begin
        -- ignore non-important fields
        print 'nothing change';
    end;

go


-- possible SqlCommand from .NET
update family set name = 'Michael', age = 20 where id = 1;    

update family set name = 'Mateo', age = 23 where id = 2;
于 2009-02-03T12:11:00.243 に答える
0

指定できないと思います。トリガー UPDATE、DELETE、および INSERT は、テーブルに対して UPDATE、DELETE、または INSERT が (それぞれ) 実行されるたびに起動されます。

Mike K.が提案したようにして、興味のある列が変更されたかどうかを確認できます。

于 2009-02-03T11:54:31.713 に答える
0
create table Programmer
(
id int not null identity(1,1),
name varchar(100) not null,
status varchar(20)
);


insert into Programmer(name,status) values('Pampers', 'Rich');




create trigger TrigUpdOnProgrammer on Programmer
for update
as

    if exists
        (
        select * from deleted 
        left join inserted on inserted.id = deleted.id    

        -- put the fields to detect here...
        and inserted.status = deleted.status -- detect if changed
        -- ...detections
        where inserted.status is null) 

       -- if changes detected on status, then check if it is Poor.  
       -- don't worry, there's no performance degradation.  SQL AND is short-circuited
       and exists(select * from inserted where status = 'Poor')
    begin    
       print 'status changed';
    end
    else begin
        print 'changes ignored';
    end;

go

-- execute the following on succession, then check the output

update Programmer set status = 'Poor' where id = 1; -- changes detected

update Programmer set status = 'Poor' where id = 1; -- changes ignored

update Programmer set status = 'Rich' where id = 1; -- changes ignored

update Programmer set status = 'Poor' where id = 1; -- changes detected
于 2009-02-03T13:03:25.630 に答える