2009-11-19 4 views
2

J'ai un déclencheur de suppression sur une table qui est utilisé pour supprimer des entrées d'une table dans une autre base de données.SQL Server delete trigger - handle de ligne renvoyé à une ligne supprimée ou à une ligne marquée pour la suppression

CREATE TRIGGER [dbo].[Trigger_Contracts_Delete] ON [dbo].[Contracts] 
AFTER DELETE NOT FOR REPLICATION 
AS 
    IF @@ROWCOUNT = 0 RETURN 

    DELETE seconddb.dbo.second_table 
    WHERE contractId IN (SELECT d.ContractID FROM deleted d) 

Lorsque je supprime un enregistrement à l'aide de mon application (app héritage rien savoir sur son fonctionnement interne) Je reçois l'erreur « poignée Row fait référence à une ligne supprimée ou une ligne marquée pour la suppression »

Cependant quand je modifié ce déclencheur pour ajouter une instruction select supplémentaire (SELECT d.ContractID FROM deleted d) juste avant de supprimer .. Je ne reçois pas le message d'erreur. Quelle pourrait être la raison pour que cela fonctionne lorsque l'instruction select est ajoutée, est-ce qu'en émettant select sur "deleted" j'ai verrouillé la table "deleted"? il émettra un

CREATE TRIGGER [dbo].[Trigger_Contracts_Delete] ON [dbo].[Contracts] 
AFTER DELETE NOT FOR REPLICATION 
AS 
    IF @@ROWCOUNT = 0 RETURN 

    SELECT d.ContractID FROM deleted d; 

    DELETE seconddb.dbo.second_table 
    WHERE contractId IN (SELECT d.ContractID FROM deleted d) 
+0

Y at-il un déclencheur sur le seconddb.dbo.secondtable. En général, cette erreur se produit lorsque vous essayez de référencer une ligne d'une table au milieu d'une transaction non validée. Juste pour une pensée, essayez d'ajouter un indice NOLOCK à l'IN (SELECT d.ContractID FROM supprimé d) – Sparky

+0

Merci Sparky. Voici plus de détails seconddb.dbo.second_table a une table enfant seconddb.dbo.second_table_child qui a une relation de suppression en cascade [si l'enregistrement parent dans seconddb.dbo.second_table est supprimé les enregistrements enfants dans seconddb.dbo.second_table_child seront supprimés. ] Et il existe un déclencheur de suppression sur seconddb.dbo.second_table_child qui est utilisé pour mettre à jour l'enregistrement parent dans seconddb.dbo.second_table lorsqu'une ligne de seconddb.dbo.second_table_child est supprimée. – vijayp

+0

Avez-vous trouvé une solution pour cela? –

Répondre

0

Si vous alawys à supprimer les enregistrements de la table des enfants, pourquoi ne pas mettre en place en cascade delte au lieu d'un déclencheur?

+1

Les tables se trouvent dans des bases de données différentes, il n'y a donc pas de clé étrangère. Par conséquent, nous avons utilisé le déclencheur. – vijayp

4

votre table (s) sont manquantes clés primaires! ajouter des clés primaires et le problème disparaîtra.

+0

J'aimerais avoir posté les résultats à ce moment-là. Maintenant, je ne me souviens pas et je n'ai pas de retour en arrière - le changement d'emploi. – tech20nn

+0

Jamais vécu cela moi-même mais semble réalisable selon http://robertoschiabel.wordpress.com/2008/10/20/row-handle-referred-to-a-deleted-row-or-a-row-marked-for- effacement/ –

Questions connexes