Question

J'utilise Sqlserver express et je ne peux pas utiliser le déclencheur avant la mise à jour . Il y a une autre façon de faire ça?

Était-ce utile?

La solution

MSSQL ne prend pas en charge les déclencheurs BEFORE . Le plus proche de vous est le déclencheur INSTEAD OF , mais son comportement est différent de celui des déclencheurs BEFORE dans MySQL.

Vous pouvez en savoir plus à leur sujet ici . et notez que INSTEAD OF déclenche "Indique que le déclencheur est exécuté à la place de l'instruction SQL de déclenchement, remplaçant ainsi les actions des instructions de déclenchement." Ainsi, les actions sur la mise à jour peuvent ne pas avoir lieu si le déclencheur n'est pas correctement écrit / géré. Les actions en cascade sont également affectées.

Au lieu de cela, vous voudrez peut-être utiliser une approche différente de ce que vous essayez d'atteindre.

Autres conseils

Il est vrai qu’il n’existe pas de " avant déclencheurs " dans MSSQL. Cependant, vous pouvez toujours suivre les modifications apportées à la table en utilisant le symbole "inséré". et " supprimé " tables ensemble. Lorsqu'une mise à jour provoque le déclenchement de la gâchette, le " inséré " table stocke les nouvelles valeurs et les informations "supprimé" table stocke les anciennes valeurs. Une fois que vous avez cette information, vous pouvez simuler relativement facilement le "déclencheur avant". comportement.

Vous ne pouvez pas être sûr que cela s'applique à SQL Server Express , mais vous pouvez toujours accéder à l'option "Avant". données même si votre déclencheur se produit APRÈS la mise à jour. Vous devez lire les données de la table supprimée ou insérée créée à la volée lors de la modification de la table. C’est essentiellement ce que dit @Stamen, mais j’ai encore besoin d’explorer plus avant pour comprendre cette réponse (utile!).

  

La table supprimé stocke des copies des lignes concernées au cours de DELETE et   UPDATE déclarations. Pendant l'exécution d'un DELETE ou d'une UPDATE   déclaration, les lignes sont supprimées de la table des déclencheurs et transférées vers   la table supprimée ...

     

La table insérée stocke des copies des lignes concernées lors de l'insertion.   et les déclarations UPDATE. Au cours d’une transaction d’insertion ou de mise à jour, une nouvelle   des lignes sont ajoutées à la table insérée et à la table de déclenchement ...

     

https://msdn.microsoft.com/en-us/library/ ms191300.aspx

Vous pouvez donc créer votre déclencheur pour lire les données de l'une de ces tables, par exemple.

CREATE TRIGGER <TriggerName> ON <TableName>
AFTER UPDATE
AS
  BEGIN
    INSERT INTO <HistoryTable> ( <columns...>, DateChanged )
    SELECT <columns...>, getdate()
    FROM deleted;
  END;

Mon exemple est basé sur celui-ci:

http://www.seemoredata.com/en/showthread.php?134-Example-of-BEFORE-UPDATE-trigger-in-Sql-Server-good-for- Mises à jour de type-2-dimension-table

< une classe = "post-tag" href = "/ questions / tagged / triggers" title = "affiche les questions étiquetées 'triggers'" rel = "tag"> triggers

T-SQL ne prend en charge que les déclencheurs AFTER et INSTEAD OF. Il ne comporte pas de déclencheur BEFORE, contrairement à certains autres SGBDR.

Je pense que vous souhaiterez utiliser un déclencheur INSTEAD OF.

Tous les "normaux" Les déclencheurs dans SQL Server sont "APRES ...". déclencheurs. Il n'y a pas d '"AVANT ...". déclencheurs.

Pour faire quelque chose avant une mise à jour, consultez Déclencheurs INSTEAD OF UPDATE .

Pour effectuer un AVANT LA MISE À JOUR dans SQL Server, j'utilise une astuce. Je fais une fausse mise à jour de l'enregistrement ( UPDATE Table SET Field = Field ), de sorte que j'obtiens l'image précédente de l'enregistrement.

N'oubliez pas que lorsque vous utilisez un déclencheur à la place, il ne commettra pas l'insertion, sauf si vous le spécifiez spécifiquement dans le déclencheur. Au lieu de réellement, faites ceci au lieu de ce que vous faites normalement, afin qu'aucune des actions d'insertion normales ne se produise.

Exemple complet:

CREATE TRIGGER [dbo].[trig_020_Original_010_010_Gamechanger]
   ON  [dbo].[T_Original]
   AFTER UPDATE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @Old_Gamechanger int;
    DECLARE @New_Gamechanger int;

    -- Insert statements for trigger here
    SELECT @Old_Gamechanger = Gamechanger from DELETED;
    SELECT @New_Gamechanger = Gamechanger from INSERTED;

    IF @Old_Gamechanger != @New_Gamechanger

        BEGIN

            INSERT INTO [dbo].T_History(ChangeDate, Reason, Callcenter_ID, Old_Gamechanger, New_Gamechanger)
            SELECT GETDATE(), 'Time for a change', Callcenter_ID, @Old_Gamechanger, @New_Gamechanger
                FROM deleted
            ;

        END

END
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top