2016-12-03 3 views
0

Je travaille sur un déclencheur dans Microsoft SQL Server 2012SQL Server n'accepte pas la syntaxe correcte sur la gâchette

Voici ce que j'ai à ce jour, après ce que je sais être syntaxe:

CREATE TRIGGER restore_trigger 
ON dbo.Lead 
AFTER DELETE OF id, firsname, lastname, postalcode, address,phone, email, title, managementlevel, lastcalldate, lastcallresult, companyid 
REFERENCING OLD ROW as OldRow 
FOR EACH ROW 
    INSERT INTO dbo.Lead 
    VALUES (OldRow.id, OldRow.firstname, OldRow.lastname, OldRow.postalcode, OldRow.address, OldRow.phone, OldRow.email, 
OldRow.title, OldRow.managmentlevel, OldRow.lastcalldate, OldRow.lastcallresult, OldRow.companyid); 

Microsoft SQL Server renvoie une erreur avec 'de' et toutes les valeurs de OldRow que je veux insérer dans dbo.Lead.

+0

Vous ne pouvez utiliser le mot-clé OF qu'avec un INSTEAD. https://msdn.microsoft.com/en-us/library/ms189799.aspx –

+2

Ceci est *** NOT *** syntaxe correcte pour un déclencheur dans SQL Server - simple et clair. SQL Server ne possède PAS ** de clause FOR FOR RACH, T-SQL ne prend pas en charge '' AFTER DELETE of ....... '- et T-SQL ne prend pas en charge le ' Mots-clés OLD' ou 'NEW' - vous devez lire la [** documentation MSDN officielle **] (https://msdn.microsoft.com/fr-fr/library/ms189799.aspx) sur la syntaxe de déclenchement exacte pour T -SQL !! –

+0

@marc_s C'est la syntaxe que mon professeur m'a enseignée. Si je voulais lancer un trigger comme ça, que ferais-je? Puis-je avoir un exemple s'il vous plaît? Je regardais la documentation plus tôt et je ne peux pas la comprendre. –

Répondre

1

Comme je l'ai dit - votre code actuel est plein d'erreurs de syntaxe et de logique quand il s'agit de déclencheurs T-SQL.

Si vous voulez "sauver" les anciennes valeurs (qui sont en cours de suppression), vous pouvez utiliser ce code:

CREATE TRIGGER restore_trigger 
ON dbo.Lead 
AFTER DELETE 
AS 
    INSERT INTO dbo.Lead (id, firstname, lastname, postalcode, address, phone, email, title, managmentlevel, lastcalldate, lastcallresult, companyid) 
     SELECT 
      id, firstname, lastname, postalcode, address, phone, email, title, managmentlevel, lastcalldate, lastcallresult, companyid 
     FROM 
      Deleted; 

Avis:

  • Je recommanderais à toujours spécifier les colonnes que vous insérez dans - aucune exception.
  • Vous avez seulement besoin d'avoir une seule instruction SELECT qui prend toutes les lignes de la table Deleted pseudo et insère ces valeurs dans la table cible - ce manipulera plusieurs rangées effacements aussi (si une déclaration de la vôtre supprime 20 lignes)

Mais je ne suis pas clair pourquoi vous voulez INSERT les lignes supprimées de nouveau dans la table à partir de laquelle ils sont supprimés ...... quel est le but de ce ?? En règle générale, vous seriez bien plus forte raison stocker ces valeurs dans un Audit table ou quelque chose .....

Et si vous voulez essentiellement annuler les effets d'une DELETE - pourquoi pas seulement empêcher la DELETE en premier lieu, en supprimant la permission de supprimer de cette table de ces utilisateurs qui ne sont pas autorisés à supprimer? .... Semble beaucoup plus efficace à empêcher une opération non désirée, plutôt que de le défaire dans un déclencheur. ...

+0

Oui, je me rends compte que ce déclencheur est un peu trivial et n'a pas de réelle application pratique. Je devais écrire tout type de déclencheur que je voulais pour la base de données.C'est la première chose que j'ai pu trouver qui n'implique pas d'avoir à faire une nouvelle table pour contenir des valeurs/statistiques qui ont été calculées. –