2011-05-26 5 views
1

Bien que cela soit terminé avec succès à la fin, il n'a pas la mise à jour souhaitée.le déclencheur ne met pas à jour le sql

 
CREATE TRIGGER Trigger1 
On dbo.[table1] 
FOR UPDATE 
AS 
Declare @Id int; 
SELECT @Id = Issue_Id FROM dbo.[table1] 

INSERT INTO dbo.[storage] 
    SELECT Id, Title, project, Problem 
    FROM dbo.[table2] 
    WHERE Id = @Id 

Y at-il quelque chose que je fais mal ou que je ne peux pas utiliser des variables dans le cadre d'un déclencheur?

Un grand merci

Répondre

1

Les autres ont correctement répondu que vous devez utiliser inserted et une jointure, pour générer un déclencheur approprié. Mais:

En fonction de vos commentaires aux réponses des autres - vous ne devriez jamais tenter d'accéder à une ressource en dehors de votre propre base de données à partir d'un déclencheur, laissez-le d'un autre serveur. Essayez de découpler l'activité du déclencheur de l'activité de serveur croisé - disons que votre déclencheur ajoute une ligne à une table de file d'attente (ou utilise des files d'attente de courtier de service réel) et qu'un composant indépendant soit responsable de ces demandes.

Sinon, s'il y en a par ex. problèmes de réseau, non seulement votre déclencheur se brise, mais il oblige également une restauration pour la mise à jour d'origine - cela rend votre base de données locale inutilisable.

Cela signifie également que le composant indépendant peut faire face à délais d'attente et effectuer appropriés relances, etc.

+0

Oui, pas la plus idéale des situations. Merci beaucoup pour votre contribution supplémentaire concernant les problèmes que je pourrais rencontrer. – Node17

2

Veuillez passer en revue la suggestion ci-dessous.

au lieu de la ligne ci-dessous

SELECT @Id = Issue_Id FROM dbo.[table1] 

Il fallait suivant.

SELECT Issue_Id FROM Inserted 

Voici la version mise à jour.

CREATE TRIGGER Trigger1 
On dbo.[table1] 
FOR UPDATE 
AS 
SET NOCOUNT ON 
Declare @Id int; 

With CTE as 
(
    SELECT Issue_Id FROM Inserted I 
    Inner Join [table1] T on T.Issue_Id = I.Issue_Id 
) 

INSERT INTO dbo.[storage] 
SELECT Id, Title, project, Problem 
FROM dbo.[table2] 
Inner Join CTE c on c.Issue_Id = Id 

Pour plus d'informations

Dans le serveur SQL les enregistrements qui sont insérés/modifiés ou supprimés s'occupe dans deux tables temporaires disponibles dans un déclencheur DML. Ces tables sont INSERTED et DELETED. La table INSERTED a inséré ou mis à jour des enregistrements. La table DELETED a l'ancien état des enregistrements mis à jour ou supprimés.

+0

Cela ne fonctionnera toujours pas pour les mises à jour multi-lignes. 'dbo. [table2]' aurait besoin de 'JOIN' sur la table 'inserted' plutôt que de supposer que' Issue_Id' ne sera qu'une seule valeur. –

+0

Oui. En fait, @ Node17 insère un enregistrement basé sur un identifiant particulier. – Pankaj

+0

L'ensemble Issue_ID échouera toujours s'il y a plusieurs lignes dans 'Inserted' –

2

Pour gérer multple mises à jour et la table inserted en une seule fois:

CREATE TRIGGER Trigger1 
On dbo.[table1] 
FOR UPDATE 
AS 

INSERT INTO dbo.[storage] 
    SELECT Id, Title, project, Problem 
    FROM dbo.[table2] t2 
     JOIN Inserted i ON i.Issue_ID = t2.Id 
+0

+1 Pour gérer les multirows correctement. –

+0

J'essayais d'éviter les jointures car il s'agit d'une requête multi-serveur avec un problème majeur avec les délais d'expiration. – Node17

+0

@ NOde17 - requête cross-serveur? Dans un * trigger *? Ewww. –

4

Pour soutenir les mises à jour multilignes

CREATE TRIGGER Trigger1 On dbo.[table1] FOR UPDATE 
AS 
SET NOCOUNT ON 

INSERT INTO dbo.[storage] 
    SELECT t.Id, t.Title, t.project, t.Problem 
    FROM dbo.[table2] t 
     JOIN INSERTED I ON t.ID = I.ID 
GO 

Si table2 est en fait table1 (ce qui est plus logique: comment est table1 lié à storage et table2?) ...

CREATE TRIGGER Trigger1 On dbo.[table1] FOR UPDATE 
AS 
SET NOCOUNT ON 

INSERT INTO dbo.[storage] 
    SELECT Id, Title, project, Problem 
    FROM INSERTED 
GO 
+0

+1 pour 'SET NOCOUNT ON' –

+0

J'ai des problèmes de timeout avec l'interrogation multi-serveur. Donc, la table 1 est ce que je saisis dans les données, quand l'ID_mission est entré, je veux un déclencheur pour sélectionner les données de l'autre serveur où il correspond à l'ID de problème. Ensuite, les informations sélectionnées de l'autre serveur seront insérées dans une copie locale de l'autre serveur pour résoudre les problèmes de dépassement de délai. – Node17

1

ligne ci-dessous doit être retiré

SELECT @Id = ISSUE_ID DE dbo. [Table1]

Cela devrait suivre.

SELECT Issue_Id FROM Inséré

Questions connexes