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 :

création d'un trigger générique


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 22
    Points : 8
    Points
    8
    Par défaut [résolu] création d'un trigger générique
    Bonjour,

    J'ai créé trois triggers qui me permettent d'insérer un enregistrement dans une table dès que je fais une DML à partir d'une autre table. J'ai donc à chaque fois trois triggers.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    create trigger Purchase_Delete on Group_Purchase_Log
        after delete
        as
            insert into Log values (GETDATE(), 'Delete', 'Group_Purchase_Log')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    create trigger Purchase_Insert on Group_Purchase_Log
        after insert
        as
            insert into Log values (GETDATE(), 'Insert', 'Group_Purchase_Log')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    create trigger Purchase_Update on Group_Purchase_Log
        after Update
        as
            insert into Log values (GETDATE(), 'Update', 'Group_Purchase_Log')
    Le problème est que j'aimerais n'avoir plus qu'un seul trigger qui serait bon pour toutes les tables mais pour cela il me faudrait pouvoir déterminer lquel type de DML a déclencher le trigger pour que je puisse mettre le bon libellé dans mon insert ainsi que le nom de la table qui a déclenché le trigger.

    Merci d'avance pour votre aide.

  2. #2
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Create Trigger Purchase_Update on Group_Purchase_Log 
        for Insert, Update, Delete
    AS 
           Insert into Log values (GETDATE(), 'Update', 'Group_Purchase_Log')

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    pour le for delete, insert, update je savais comment faire, le problème c'est quand je fais mon insert dans ma table log, je dois donner les infos suivantes : la date système (getDate()), le type de dml (insert, update ou delete) et le nom de la table ayant subi la dml (autrement dit la table faisant appel au trigger), le problème est que je ne sais pas comment récupérer ces deux informations.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    concrètement je devrais avoir un trigger ressemblant à ceci (enfin, je crois)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create trigger Customer_Trigger on Customer
        for insert, delete, update
        as
    		declare @table_name varchar(60)
    		declare @dml_name varchar(20)
    		set @table_name = 'Customer'
    		set @dml_name = 'Insert'
     
            insert into Log values (GETDATE(), @dml_name, @table_name)
    mais à la place d'avoir un set @table_name = 'Customer', je devrais avoir une requête sql me permettant d'obtenir le nom de la table à partir de laquelle le trigger a été déclenché
    et à la place du set @dml_name = 'Insert', je devrais avoir une requête me disant sur quel type de dml le trigger c'est déclenché

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    j'ai cru trouvé la solution pour récupérer le type de dml mais ca ne marche toujours pas.
    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
    create trigger Purchase_Trigger on GROUP_PURCHASE_LOG
    	for insert, delete, update
    	as
     
    			declare @table_name varchar(60)
    			declare @dml_name varchar(30)
     
    			set @table_name = 'Group_Purchase_Log'
    			set @dml_name = 'Purchase_Trigger'
     
    			if OBJECTPROPERTY ( object_id(@dml_name),'EXECISINSERTTRIGGER') = 1 
    				set @dml_name = 'Insert'		
    			else
    				if OBJECTPROPERTY ( object_id(@dml_name),'EXECISDELETETRIGGER') = 1 
    					set @dml_name = 'Delete'					
    				else
    					if OBJECTPROPERTY ( object_id(@dml_name),'EXECISUPDATETRIGGER') = 1 
    						set @dml_name = 'Update'								
     
    		insert into Log values (GETDATE(), @dml_name, @table_name)
    à chaque fois le dml_name est mis à insert et ce, même si je fais un update ou un delete. idem si je mets update au lieu de insert dans mon premier if, on dirait qu'il ne va pas plus loin et prends directement la première valeur.
    si quelqu'un pouvait m'aider ca m'arrangerait bien.
    merci d'avance.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    C'est bon, on m'a conseiller de ne pas grouper mes trois triggers ensemble car ça pourrait me jouer pas mal de problème alors j'ai finalement décidé de garder mes trois triggers.

    J'ai quand même choisi de faire une procédure stockée de mon insert.

    Si ça intéresse quelqu'un voici comment j'ai fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create procedure Procedure_Insert_Log 
    	@dml_name varchar(30), 
    	@table_name varchar(60)
    as
    	insert into Log values (GETDATE(), @dml_name, @table_name)
    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
    create trigger Customer _Insert on Customer 
    for insert
    as
    	declare @dml_name varchar(30)
    	declare @table_name varchar(60)
    	set @dml_name = 'Insert'
    	set @table_name = 'Customer'
    	exec Procedure_Insert_Log @dml_name, @table_name
     
    create trigger Customer_Delete on Customer	
    for delete
    as
    	declare @dml_name varchar(30)
    	declare @table_name varchar(60)
    	set @dml_name = 'Delete'
    	set @table_name = 'Customer'
    	exec Procedure_Insert_Log @dml_name, @table_name
     
    create trigger Customer _Update on Customer
    for update
    as
    	declare @dml_name varchar(30)
    	declare @table_name varchar(60)
    	set @dml_name = 'Update'
    	set @table_name = 'Customer'
    	exec Procedure_Insert_Log @dml_name, @table_name

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pb sur la création d'un trigger dans MySql
    Par NoiBe dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 29/03/2007, 09h08
  2. Réponses: 4
    Dernier message: 23/05/2006, 18h04
  3. Aide sur la création d un Trigger
    Par hatoug dans le forum Oracle
    Réponses: 20
    Dernier message: 16/05/2006, 17h26
  4. Problème à la création d'un trigger
    Par Vincent Stryckmans dans le forum SQL
    Réponses: 3
    Dernier message: 20/10/2005, 12h27
  5. [Oracle] Aide pour la création d'un trigger
    Par Sonic dans le forum Administration
    Réponses: 14
    Dernier message: 04/11/2004, 20h54

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