2012-03-05 3 views
2

J'ai gratté ma tête avec cela pendant quelques heures déjà ... Voici ce qui se passe:Résultats double pour une mise à jour de SQL Déclaration

Je lance cette déclaration

STATUT SELECT dE [dbo] [TMP_TEST_CALL_LIST] où l'identité = '659303186000000000'

et je reçois le résultat suivant (une seule rangée):.

'Y'

Alors je cours cette déclaration

mise à jour [dbo]. [TMP_TEST_CALL_LIST] état set = 'Z' où l 'identité = '659303186000000000'

et je reçois CE !!!:

(1 row (s) affected)

(1 ligne (s) affecté)

Comme si 2 déclarations auraient été exécutées!

Mais il y a pire ... même si je lance comme ça:.

mise à jour [dbo] [TMP_TEST_CALL_LIST] état set = 'Z' où l 'identité = '659303186000000000' ET status = 'Y'

il me donnera le même résultat "double". Et si je l'exécute avec une clause WHERE qui ne correspond à aucun enregistrement, elle me dira 0 ligne (s) affectée ... deux fois. La chose (encore plus) effrayante est que cela arrive à certaines tables dans la base de données, et pas à d'autres. Je ne peux pas comprendre quelles sont les différences entre les tables.

H E L P! ! !

Merci.

Note: ceci est SQL Server 2008 R2

+3

Vérifiez s'il y a un déclencheur de mise à jour sur la table. En outre, si vous avez activé le plan d'exécution d'affichage, cela génère un ensemble de lignes supplémentaire avec des informations envoyées au client. – Andomar

Répondre

5

Triggers sont presque certainement le coupable, surtout si vous trouvez que ce comportement sur certaines tables de la base de données.

Un déclencheur est un code exécuté lorsqu'un enregistrement est INSÉRÉ, MIS À JOUR ou SUPPRIMÉ (tout ou partie de ceux-ci). Généralement, les déclencheurs sont utilisés pour implémenter des règles métier, écrire dans des tables d'audit, etc. C'est un moyen pratique d'ajouter ce type de comportement à travers l'application sans avoir à réécrire beaucoup de code. L'inconvénient est, bien sûr, le manque de transparence. Les déclencheurs ne sont pas toujours évidents qu'ils fonctionnent ou même existent.

Si vous développez l'arborescence tables dans le studio de gestion, recherchez une table qui se comporte de cette manière et développez-la davantage. Il y aura un dossier appelé triggers que vous pouvez développer pour voir les déclencheurs définis sur la table.

enter image description here

Vous pouvez également exécuter une requête à la liste déclenche comme ceci:

SELECT trigger_name = sysobjects.name, trigger_owner = USER_NAME(sysobjects.uid),table_schema = s.name, table_name = OBJECT_NAME(parent_obj), 
    isupdate = OBJECTPROPERTY(id, 'ExecIsUpdateTrigger'), isdelete = OBJECTPROPERTY(id, 'ExecIsDeleteTrigger'), 
    isinsert = OBJECTPROPERTY(id, 'ExecIsInsertTrigger'), isafter = OBJECTPROPERTY(id, 'ExecIsAfterTrigger'), 
    isinsteadof = OBJECTPROPERTY(id, 'ExecIsInsteadOfTrigger'), 
    [disabled] = OBJECTPROPERTY(id, 'ExecIsTriggerDisabled') 
FROM sysobjects INNER JOIN sysusers ON sysobjects.uid = sysusers.uid 
    INNER JOIN sys.tables t 
     ON sysobjects.parent_obj = t.object_id 
    INNER JOIN sys.schemas s 
     ON t.schema_id = s.schema_id 
WHERE sysobjects.type = 'TR' 

* Image tirée de ce site: http://www.mssqltips.com/sqlservertip/1380/disable-triggers-in-sql-server-2005/

+0

Oui !!! J'ai des déclencheurs sur les deux tables que cela se passe! Tu es un génie. J'utilise des déclencheurs pour savoir quand la date et l'heure ont été mises à jour. Maintenant une autre question: vous avez dit "coupable" - y a-t-il des risques à avoir des déclencheurs? Existe-t-il d'autres moyens d'accomplir cela? – Amarundo

Questions connexes