IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Trigger et contexte : un exemple ?


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut Trigger et contexte : un exemple ?
    Bonjour,

    J'ai besoin de créer un trigger dont le comportement sera différent selon une information de contexte.

    Ce contexte peut-être différent pour deux batchs qui tournent en //.

    Par exemple, dans une PS, je suis en contexte "debug", et dans ce cas, je dois alimenter une table de log en fonction des actions effectuées par le trigger.
    Mais dans une autre PS, je suis en mode "release", et dans ce cas, le trigger va se contenter de s'exécuter sans remplir la table de log.

    J'ai trouvé qu'on pouvait alimenter une variable "CONTEXT_INFO" et la réutiliser depuis un trigger.

    Mais les articles et les exemple de la MSDN ne sont pas très clairs : je veux être certain que si je lance mes deux procédures en même temps, le trigger se comportera comme il doit.

    Est-ce qu'il suffit dans la première PS de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    set context_info = 'debug';
    insert into matablequideclencheletrigger;
    set context_info = null;
    Et dans la seconde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    set context_info = 'release';
    insert into matablequideclencheletrigger;
    set context_info = null;
    Ou si cette variable se comportera comme une variable de session et ne sera pas isolée par scope ?

  2. #2
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Ca attire les foules c'est fou

    Je ne comprends pas pourquoi, context_info ne fait pas du tout ce qu'il est censé faire... Ou tout du moins, il ne fait pas ce qui est décrit dans les exemples que j'ai pu trouver.

    Voici un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    drop trigger ins_test;
    drop procedure p_test;
    drop table test;
     
    create table test
    (
    	id int identity not null primary key,
    	nom varchar(50) not null
    );
    go
     
    create procedure p_test(@nom varchar(50), @mycontext int)
    as
    begin
    	print 'On initialise le contexte à ' + convert(varchar(6), @mycontext);
    	declare @ctx varbinary(128);
    	set @ctx = convert(varbinary(128), @mycontext);
    	set context_info @ctx;
    	print 'Pour vérification le contexte à ' + convert(varchar(6), convert(int, @ctx));
     
    	print 'On insère quelquechose dans la table, pour lancer le trigger';
    	insert into test (nom) values (@nom);
     
    	print 'On repasse le contexte à une valeur par défaut qui soit incomprise par le trigger';
    	set @ctx = convert(varbinary(128), -1);
    	set context_info @ctx;
    end;
    go
     
    create trigger ins_test
    on test  
    after insert
    as
    begin
    	declare @ctx int;
    	print 'Lancement du trigger';
     
    	set @ctx = convert(int, context_info());
     
    	if @ctx = 1
    	begin
    		print 'Truc qui se déclenche si context_info = 1';
    	end;
     
    	print 'Valeur réelle du contexte : ' + convert(varchar(6), @ctx);
    end;
    go
     
    exec dbo.p_test 'Plop', 1;
    exec dbo.p_test 'Plop', 2;
    exec dbo.p_test 'Plop', 0;
    Résultat obtenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    On initialise le contexte à 1
    Pour vérification le contexte à 1
    On insère quelquechose dans la table, pour lancer le trigger
    Lancement du trigger
    Valeur réelle du contexte : 0
     
    (1*ligne(s) affectée(s))
    On repasse le contexte à une valeur par défaut qui soit incomprise par le trigger
    On initialise le contexte à 2
    Pour vérification le contexte à 2
    On insère quelquechose dans la table, pour lancer le trigger
    Lancement du trigger
    Valeur réelle du contexte : 0
     
    (1*ligne(s) affectée(s))
    On repasse le contexte à une valeur par défaut qui soit incomprise par le trigger
    On initialise le contexte à 0
    Pour vérification le contexte à 0
    On insère quelquechose dans la table, pour lancer le trigger
    Lancement du trigger
    Valeur réelle du contexte : 0
     
    (1*ligne(s) affectée(s))
    On repasse le contexte à une valeur par défaut qui soit incomprise par le trigger
    => Dans le trigger, le context_info est toujours à 0 !


    Je me suis basé sur cet article :
    http://jasondentler.com/blog/2010/01...fun-and-audit/

    PS : Ceci dit, je n'aime pas trop ce que je lis dans l'article... Moi j'aurais plutôt besoin d'une variable dont le scope reste au niveau de la fonction appelante. C'est à dire un contexte local à la procédure qui déclence le trigger. Ca existe ? Ou si je vais devoir coder une using à gaz pour le reproduire ?

  3. #3
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Remplacez votre variable de type INT en CHAR(1) par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    DROP TRIGGER ins_test;
    DROP procedure p_test;
    DROP TABLE test;
     
    CREATE TABLE test
    (
    	id int identity NOT NULL PRIMARY KEY,
    	nom varchar(50) NOT NULL
    );
    go
     
    CREATE procedure p_test(@nom varchar(50), @mycontext CHAR(1))
    AS
    begin
    	print 'On initialise le contexte à ' + convert(CHAR(1), @mycontext);
    	declare @ctx varbinary(128);
    	SET @ctx = convert(varbinary(128), @mycontext);
    	SET context_info @ctx;
    	print 'Pour vérification le contexte à ' + convert(CHAR(1), @ctx);
     
    	print 'On insère quelquechose dans la table, pour lancer le trigger';
    	INSERT INTO test (nom) VALUES (@nom);
     
    	print 'On repasse le contexte à une valeur par défaut qui soit incomprise par le trigger';
    	SET @ctx = convert(varbinary(128), -1);
    	SET context_info @ctx;
    end;
    go
     
    CREATE TRIGGER ins_test
    ON test  
    after INSERT
    AS
    begin
    	declare @ctx CHAR(1);
    	print 'Lancement du trigger';
     
    	SET @ctx = convert(CHAR(1), context_info());
     
    	IF @ctx = '1'
    	begin
    		print 'Truc qui se déclenche si context_info = 1';
    	end;
     
    	print 'Valeur réelle du contexte : ' + convert(CHAR(1), @ctx);
    end;
    go
    Résultat :

    On initialise le contexte à 1
    Pour vérification le contexte à 1
    On insère quelquechose dans la table, pour lancer le trigger
    Lancement du trigger
    Truc qui se déclenche si context_info = 1
    Valeur réelle du contexte : 1

    (1 row(s) affected)
    On repasse le contexte à une valeur par défaut qui soit incomprise par le trigger
    On initialise le contexte à 2
    Pour vérification le contexte à 2
    On insère quelquechose dans la table, pour lancer le trigger
    Lancement du trigger
    Valeur réelle du contexte : 2

    (1 row(s) affected)
    On repasse le contexte à une valeur par défaut qui soit incomprise par le trigger
    On initialise le contexte à 0
    Pour vérification le contexte à 0
    On insère quelquechose dans la table, pour lancer le trigger
    Lancement du trigger
    Valeur réelle du contexte : 0
    ++

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    GRMPF !

    J'hallucine, c'était juste ça ?

    Faudra qu'on m'explique pourquoi il aime pas un INT et préfère un CHAR mais bon

    Merci en tout cas, j'aurais jamais pensé à essayer ça !

    PS : Entre temps, j'ai finalement réétudié mon problème pour m'en passer. Après tout, si sémantiquement on ne peut pas passer de variables à un trigger, c'est qu'il doit y avoir une bonne raison, du coup j'ai changer de place certaines traitements pour les faire en dehors du trigger.

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/08/2011, 15h55
  2. exemple trigger oracle
    Par coralie.bella dans le forum PL/SQL
    Réponses: 4
    Dernier message: 02/11/2010, 20h37
  3. exemple de code de trigger
    Par mapmip dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 20/07/2010, 15h20
  4. Triggers, un exemple svp
    Par TallyHo dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/02/2008, 12h48
  5. Contexte de retour d'un trigger
    Par patrickcharda dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 23/06/2007, 20h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo