2010-09-23 8 views
3

J'utilise Delphi 5 avec SQL Server 2000 ici.ADOQuery est contournant au lieu de supprimer le déclencheur

J'ai créé une requête ADOQuery au-dessus d'une vue pouvant être mise à jour avec un déclencheur INSTEAD OF DELETE.

La vue pouvant être mise à jour est essentiellement utilisée pour contrôler les suppressions logicielles. Il filtre les enregistrements marqués comme supprimés et masque également la colonne de contrôle.

Tout fonctionne correctement lorsque je publie des commandes DELETE directes dans la base de données. Je supprime l'enregistrement sur la vue et la table sous-jacente est mise à jour, en effectuant la suppression logicielle comme prévu. Lorsque j'essaie d'utiliser ADOQuery pour supprimer un enregistrement, il contourne la vue et supprime l'enregistrement directement sur la table sous-jacente, de sorte que le déclencheur au lieu de supprimer sur la vue n'est jamais déclenché. J'utilise aussi des contraintes référentielles et la suppression est une erreur à cause d'eux, mais je ne sais pas si cela est important. Cela ne se produit pas lors de l'émission de commandes de suppression dans la vue.

Est-ce que n'importe lequel d'entre vous sait comment contourner ce comportement ennuyeux?

+3

Avez-vous essayé de profiler le serveur pour voir quelles commandes SQL l'ADOQuery exécute? –

+0

exec sp_executesql N'DELETE DE "CONTROLEPROCESSOS_MIGRACAO" .. "_ tblCadUsuarios" OU "CODUSUARIO" = @ P1' , N '@ P1 nvarchar (5)', N'40/04' _tblCadUsuarios est la table réelle et la vue est nommée tblCadUsuarios –

+1

Mes connaissances du serveur SQL sont datées et je peux piétiner tout ce dont elle est/n'est pas capable, mais pourquoi le déclencheur INSTEAD OF DELETE est-il défini sur une vue et n'est pas implémenté directement contre la table? Si je voulais des suppressions douces sur une table, j'essayerais de m'assurer que je (ou n'importe qui d'autre) n'aurais pas d'ennuis parce que j'ai oublié d'utiliser la vue ...? –

Répondre

1

Notez qu'il supprime directement à partir de la table principale à la place? C'est probablement parce qu'il détecte que c'est une vue et travaille avec la table sous-jacente elle-même. Pour éviter cela, déclarez votre vue WITH VIEW_METADATA, voir ALTER VIEW pour plus d'informations. Ensuite, la bibliothèque ADO traitera la vue en tant que table.

Sachez que pouvez obtenir des effets secondaires indésirables en trichant votre bibliothèque DB comme ceci, comme dans les cas où la suppression n'est pas réellement effectuée ou qu'il effectue une mise à jour au lieu d'une suppression.

+0

vous da man, bon monsieur –