Deux différents déclencheurs de mise à jour pour le même tableau
Comment puis-je prévenir les problèmes de verrouillage entre les deux déclencheurs qui se déclenche lors de la même manifestation sur la même table?
La DB je suis en train de travailler sur a déjà un déclencheur de mise à jour sont cryptées et donc je ne peut pas le modifier. J'ai fait un autre déclencheur de mise à jour pour accomplir de nouvelles tâches, il fonctionne correctement quand je l'ai tester directement sur la base de données, mais ne parvient pas quand je fais une mise à jour d'un produit sur l'application front-end. Apparemment, quand j'ai mon déclencheur active les deux déclencheurs échoue. Le message que je reçois est quelque chose comme "le Document est déjà ouvert, je vais l'incrémenter la valeur".
Est-ce un problème de verrouillage?
Il y a un une question relative à la où quelqu'un dit que nous pouvons avoir plus d'un déclencheur (pour le même événement) sur une table.
Voici mon déclenche code:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[tr_st_rep_update]
ON [dbo].[st]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF ( update(ref)
OR update(design)
OR update(u_update)
OR update(u_ativo)
OR update(stock)
OR update(epv1)
OR update(epv2)
OR update(epv3)
OR update(peso)
OR update(u_catnv1)
OR update(u_catnv2)
OR update(u_catnv3)
OR update(u_dpromoi)
OR update(u_dpromof)
OR update(u_destaque) )
BEGIN
IF (SELECT count(*)
FROM Inserted
INNER JOIN Deleted
ON Inserted.ststamp = Deleted.ststamp
WHERE inserted.u_ativo = 1
OR ( Deleted.u_ativo = 1
AND Inserted.u_ativo = 0 )) > 0
BEGIN
INSERT INTO RepData
(id,
REF,
familia,
stock,
epv1,
epv2,
epv3,
peso,
u_accao,
imagem,
process)
SELECT Inserted.ststamp AS id,
Inserted.REF AS REF,
Inserted.familia AS familia,
Inserted.stock AS stock,
Inserted.epv1 AS epv1,
Inserted.epv2 AS epv2,
Inserted.epv3 AS epv3,
Inserted.peso AS peso,
CASE
WHEN Deleted.u_ativo = 1
AND Inserted.u_ativo = 0 THEN 'd'
ELSE 'u'
END AS u_accao,
Inserted.imagem AS imagem,
0 AS process
FROM Inserted
INNER JOIN Deleted
ON Deleted.ststamp = Inserted.ststamp
WHERE inserted.u_ativo = 1
OR ( Deleted.u_ativo = 1
AND Inserted.u_ativo = 0 )
END
END
END
Toute aide serait appréciée.
Mise à jour: Base de données MSSQL 2008
- Pouvez-vous donner le exact message d'erreur (ou au moins le numéro d'erreur si le message n'est pas en anglais). "Le Document est déjà ouvert, je vais l'incrémenter la valeur" ne ressemble pas à un message d'erreur SQL Server.
- Je n'obtenez pas tout autre que ce message, il n'est même pas montré comme une erreur, mais un message d'information. L'opération est produit en stock mise à jour si elle est pertinente.
- si sa production, de vérifier l'application se connecte il a écrit quelque part , si pas exécuter de profils sur la base de données et voir ce qui se passe
Vous devez vous connecter pour publier un commentaire.
À l'aide de déclencheurs pour faire du post-déploiement dans le développement de sites et personnalisation est séduisant, mais c'est une mauvaise idée pour commencer et sera sans aucun doute générer en permanence des problèmes de ce genre pour vous.
Toutefois, compte tenu de cela, alors tout d'Abord: les tables peut ont plusieurs déclencheurs, ce n'est pas le problème.
Deuxièmement, le message d'erreur "Document est déjà ouvert, je vais l'incrémenter la valeur" est, soit à partir de votre client de l'application ou de l'autre (crypté) de déclenchement, ce n'est PAS un message d'erreur SQL Server. Étant donné que, vous pouvez essayer le réglage de la cryptés la gâchette pour exécuter la première, ou l'ensemble de votre détente à exécuter dernier. Ce ne sera probablement pas résoudre le problème, mais il peut déplacer l'erreur à partir du chiffré déclencher, dans votre détente où vous avez une meilleure chance de reporting et/ou de l'aborder de manière contrôlable.
Si désinvolte, le seul problème qui peut voir qui pourrait être susceptible de votre déclencheur, est si l'autre déclencheur est également à l'écriture de la
RepData
table et votre double écriture est à l'origine de clé en double violations.De déclenchement de la commande peut être contrôlée par le biais de la
sp_settriggerorder
système de procédure, qui est documenté ici.Le problème est résolu.
Je ne sais vraiment pas la source du problème, même si je pense que c'est quelque chose lié à verrouillage de table, dans ce cas la sur la table Inserted.
Je viens de changer l'intérieur de l'instruction select de sorte que je prends directement les valeurs de la st table au lieu de l'Insérer.
Merci à tous.