SQL Trigger - PullRequest
       14

SQL Trigger

1 голос
/ 03 февраля 2009

У меня есть подключенный триггер, который запускается, если 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

Ответы [ 5 ]

5 голосов
/ 03 февраля 2009

В триггере обновления вы можете проверить, обновляется ли столбец:

ЕСЛИ ОБНОВЛЕНИЕ (TENANTSATISFACTION) НАЧАТЬ .... END

0 голосов
/ 03 февраля 2009
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
0 голосов
/ 03 февраля 2009

Соединение слева от новой версии записи из старой версии, если объединенная таблица (то есть вставленная) имеет нулевое значение, это означает, что поля, которые вы хотите обнаружить, изменились.

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;
0 голосов
/ 03 февраля 2009

Не можете ли вы что-то сделать с помощью опции вложенных триггеров?
(Отключите эту опцию, чтобы триггеры не вызывали срабатывание других триггеров)

Или, может быть, вы могли бы создать триггер INSTEAD OF вместо триггера AFTER. Конечно, тогда в вашем триггере INSTEAD OF вы также должны написать оператор UPDATE (или вставка), который должен выполнить фактическое обновление или вставку в таблицу, рядом с дополнительной логикой.

0 голосов
/ 03 февраля 2009

Не думаю, что вы можете это указать. Триггеры UPDATE, DELETE и INSERT срабатывают всякий раз, когда для таблицы выполняется UPDATE, DELETE или INSERT (соответственно).

Вы можете сделать, как предложил Майк К., и проверить, изменился ли интересующий вас столбец или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...