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

MS SQL Server Discussion :

SQL SERVER : Triggers


Sujet :

MS SQL Server

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 212
    Par défaut SQL SERVER : Triggers
    Bonjour,

    voila je suis debutant en trigger cependant j'ai fait un trigger qui lors d'un INSERT INTO dans une table le trigger alimente une autre table !

    Je fais mes test dans la base "pubs" sous sql server

    J'ai donc crée une table "table_log".
    Le but etait ici de recuperer le nt_username, la date et la commande executé de la personne qui effectue un INSERT INTO dans la table "authors".

    Cependant j'ai ajouté a ma table "table_log" le champs "fname" car j'aimerai que dans la table "table_log" il y ai par exemple le detail de l'insertion puisque la table sysprocesses ne renvoi que la cmd soit "INSERT".

    un ptit exemple pour aider a la comprehension car pas sur que mon texte soit clair :

    lors d'une insertion dans la table "authors" comme ce qui suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    insert into authors
    values('123-45-6790','TOTO','TITI','123 456-7890','12 rue toto','noisy','93','93130','1')
    j'aimerai qu'en retour dans ma table "table_log" la valeur "TOTO" soit presente.


    Voici mon trigger

    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 trc_dlt 
    ON authors
    FOR INSERT AS
    begin
    INSERT INTO guest.table_log
    SELECT 	spid,
    	ecid,
    	STATUS,
           	loginame=rtrim(loginame),
    	hostname,
    	blocked=convert(char(5),blocked),
    	dbid = db_id(),
    	cmd='INSERT',
    	nt_username,
    	login_time=current_timestamp
     
    FROM  master..sysprocesses
    WHERE dbid=db_id()
    AND cmd<>'AWAITING COMMAND'
    et voici ma table_log

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    CREATE TABLE table_log
    (spid int,
    ecid int,
    STATUS nchar(30),
    loginame varchar(50),
    hostname varchar(50),
    blocked smallint,
    dbid smallint,
    cmd varchar(50),
    nt_username varchar(50),
    login_time datetime,
    fname varchar(50)
    merci pour votre aide

  2. #2
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    tu as plusieurs erreurs de script
    dans ton

    CREATE TABLE table_log
    (spid int,
    ecid int,
    STATUS nchar(30),
    loginame varchar(50),
    hostname varchar(50),
    blocked smallint,
    dbid smallint,
    cmd varchar(50),
    nt_username varchar(50),
    login_time datetime,
    fname varchar(50)


    tu définis blocked en smallint alors que dans le trigger tu passes un char(5)
    blocked=convert(char(5),blocked),

    ensuite tu fais un insert de 10 champs dans une table de 11 en les nommant
    ecris plutot après avoir mis ton champ blocked en char(5) dans la table de log:
    CREATE TRIGGER trc_dlt
    ON authors
    FOR INSERT AS
    begin
    INSERT INTO guest.table_log
    SELECT
    spid,
    ecid,
    STATUS,
    rtrim(loginame),
    hostname,
    convert(char(5),blocked),
    db_id(),
    'INSERT',
    nt_username,
    current_timestamp,
    'le nom que tu veux'
    FROM master..sysprocesses
    WHERE dbid=db_id()
    AND cmd<>'AWAITING COMMAND'
    voila
    A+
    serge

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 212
    Par défaut
    oui merci pour l'info mais j'etai deja au courant de ca si j'ai mi le 11eme champs dans ma table c pour que vous l'ayez en visuel tt simplement.

    J'aimerai savoir si c possible de recuperer la valeur de fname lors de l'insertion ? si oui comment ?

    merci

  4. #4
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    dans ton trigger tu ajoute au debut


    CREATE TRIGGER trc_dlt
    ON authors
    FOR INSERT AS
    begin
    declare
    @champ1 varchar(50),
    @champ2 varchar(50),
    @champ3 varchar(50),
    ...
    @champ11 varchar(50)
    @fname varchar(500)

    select @champ1=champ1,@champ2=champ2, ... ,@champ11=champ11 from inserted

    set @fname= 'insertion => valeur des champs: '+@champ1 + ' / '+@champ2 + ..... +' / '+@champ11


    INSERT INTO guest.table_log
    SELECT
    spid,
    ecid,
    STATUS,
    rtrim(loginame),
    hostname,
    convert(char(5),blocked),
    db_id(),
    'INSERT',
    nt_username,
    current_timestamp,
    @fname
    FROM master..sysprocesses
    WHERE dbid=db_id()
    AND cmd<>'AWAITING COMMAND'

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 212
    Par défaut
    merci je comprend mieux maintenant

    par contre d'apres ce que je vois je suis obliger d'inserer dans la table tous les champs que j'insere dans mon insert into

    Est-il possible d'inserer par exemple uniquement le 3eme champs ?

    j'ai utiliser le code suivant suite a votre reponse :

    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
     
    ALTER     TRIGGER trc_insrt 
    ON authors
    FOR INSERT AS
    begin
     
     
    declare
    @fname varchar(500),
    @champ1 varchar(500)
     
    select @champ1=au_fname from inserted
     
    set @fname= @champ1
     
     
     
     
    INSERT INTO guest.table_log
    SELECT 	spid,
    	ecid,
    	STATUS,
           	loginame=rtrim(loginame),
    	hostname,
    	blocked=convert(char(5),blocked),
    	dbid = db_id(),
    	cmd='INSERT',
    	nt_username,
    	login_time=current_timestamp
     
    FROM  master..sysprocesses
    WHERE dbid=db_id()
    AND cmd<>'AWAITING COMMAND' 
    end

    et je recupere le message d'erreur suivant

    Serveur : Msg 213, Niveau 16, État 4, Procédure trc_insrt, Ligne 22
    Erreur INSERT : le nom ou le numéro de colonne des valeurs fournies ne correspondent pas à la définition de la table.

  6. #6
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    oui, c'est possible
    dans ce cas justement tu nommes les champs mais avant le select


    INSERT INTO guest.table_log (fname)
    SELECT @fname
    FROM master..sysprocesses
    WHERE dbid=db_id()
    AND cmd<>'AWAITING COMM


    ou
    INSERT INTO guest.table_log (spid,fname)
    SELECT 23,@fname
    FROM master..sysprocesses
    WHERE dbid=db_id()
    AND cmd<>'AWAITING COMM

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 212
    Par défaut
    C'est super ! ca fonctionne
    Merci bcp

    Petite question supplémentaire j'ai vu que vous avez mit select 23,@fname ...

    a quoi correspond le 23 ?

  8. #8
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    c'est juste pour te donner un exemple avec 2 champs dont un est une valeur fixe

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

Discussions similaires

  1. [2008] SQL SERVER - Trigger INSERT/UPDATE pour autre Database
    Par warri0r21 dans le forum Développement
    Réponses: 10
    Dernier message: 20/01/2014, 14h06
  2. SQL SERVER Trigger de modification
    Par Sabact dans le forum Développement
    Réponses: 3
    Dernier message: 23/12/2008, 16h20
  3. Sybase -> SQL Server TRIGGER et ROLLBACK
    Par vincenteraptor dans le forum Développement
    Réponses: 2
    Dernier message: 03/07/2006, 12h16
  4. SQL SERVER Trigger et executable
    Par elkamy dans le forum Développement
    Réponses: 1
    Dernier message: 10/12/2005, 13h02
  5. Insertion dans table SQL server (Trigger) Aidz moi SVP????
    Par pop bob dans le forum Développement
    Réponses: 2
    Dernier message: 30/07/2005, 23h55

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