2010-07-13 8 views
0

Je sélectionne les données d'une table dans un déclencheur (FOR UPDATE). Certaines lignes que je sélectionne ont été mises à jour par une transaction qui a déclenché le déclencheur et certaines lignes ne le sont pas. Je voudrais écrire quelque part dans l'ensemble de données un drapeau pour chaque ligne, laquelle valeur serait calculée comme "id IN (SELECT [id] FROM INSERTED)". Ce drapeau montrerait, est une rangée mise à jour avec la dernière transaction ou pas.Sélection de données, définition d'une valeur calculée dans une colonne

Est-ce possible en SQL?

Bien sûr, je peux faire 2 requêtes distinctes, avec 2 conditions différentes, mais la perfomance de déclenchement est véritable goulot d'étranglement ...

+0

Quand vous dites [sql] voulez-vous dire [sql-server]? Les déclencheurs varient selon les différentes versions du SGBD. – APC

+0

Les déclencheurs sont juste le contexte. La question concernait case/when/then/comme syntaxe. – noober

Répondre

1

Voici un exemple pour SQL Server:

if object_id('TriggerTest') is not null 
    drop table TriggerTest 

create table TriggerTest (id int identity, name varchar(50), inLastUpdate bit) 

insert TriggerTest (name) values ('joe'), ('barrack'), ('george'), ('dick') 
go 
create trigger dbo.TriggerTestDelete 
on TriggerTest 
after update 
as begin 
    declare @date datetime 
    set @date = GETDATE() 

    update dbo.TriggerTest 
    set  inLastUpdate = 
       case when id in (select id from inserted) then 1 
         else 0 
       end 
end 
go 
update TriggerTest set name = name where id in (1,2) 
update TriggerTest set name = name where id in (1,3) 
select * from TriggerTest 

Cette impression:

id name  inLastUpdate 
1  joe   1 
2  barrack  0 
3  george  1 
4  dick  0 
Questions connexes