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)
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
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
Avez-vous trouvé une solution pour cela? –