2009-12-15 6 views
1

Existe-t-il une autre façon de déterminer le type de commande dans le déclencheur, puis de tester les tables DELETED et INSERTED?Détermination du type de commande sql dans le déclencheur dans le serveur SQL 2000

Actuellement, mon approche est la suivante:

(EXISTS (select 1 from INSERTED) AND NOT EXISTS (select 1 from DELETED)) = INSERT 
(EXISTS (select 1 from INSERTED) AND EXISTS (select 1 from DELETED)) = UPDATE 
(NOT EXISTS (select 1 from INSERTED) AND EXISTS (select 1 from DELETED)) = DELETE 

Répondre

5

Quickest:

IF NOT EXISTS (SELECT * FROM DELETED) 
    PRINT 'INSERT' 
ELSE IF NOT EXISTS (SELECT * FROM INSERTED) 
    PRINT 'DELETE' 
ELSE 
    PRINT 'UPDATE' 

Plus Inefficace

SELECT @foo int 
SET @foo = (SELECT COUNT(*) FROM INSERTED) - (SELECT COUNT(*) FROM DELETED) 
IF @foo > 0 
    PRINT 'INSERT' 
ELSE @foo < 0 
    PRINT 'DELETE' 
ELSE 
    PRINT 'UPDATE' 

En général, vous aurez rarement ont un déclencheur qui couvre tous les 3. Dans mon expérience c'est U/D ou I/U où vous pouvez vérifier moins.

Notez que le déclencheur sur MyTable ci-dessous se déclenche toujours mais aucune ligne n'est réellement insérée. Vous ne pouvez pas intercepter ceci à moins d'avoir un déclencheur d'insertion séparé

INSERT dbo.Mytable (col1,...) 
SELECT 
    value1, ... 
WHERE 
    1 = 0 
+0

"Généralement, vous aurez rarement un déclencheur qui couvre tous les 3." Je suis d'accord, je n'ai presque jamais de déclencheur qui ne soit pas seulement pour un type d'action. – HLGEM

+0

Merci pour cela, en effet votre version est plus optimisée. Dans mon scénario, j'ai besoin de toutes les commandes pour être couvert comme je l'ai conçu et développé un certain type d'utilisateur, déclencheur basé sur le système de capture de données de changement efficace pour sql 2000, vous pouvez le voir ici http://vimeo.com/7320439. – Tomek

Questions connexes