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 :

[SQL SERVER 2005]créer un trigger pour chaque table de chaque DB


Sujet :

Développement SQL Server

  1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut [SQL SERVER 2005]créer un trigger pour chaque table de chaque DB
    Bonjour,

    Je suis d'un nouveau projet qui est de centralisé les logs de différentes applications dans une DB.

    J'ai donc créé un nouvelle DB nommée DbLog.
    Cette DB est constitué d'une table nommé tbLog qui se compose comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    timestp (PK, timestamp, not null)
    username (varchar(50), not null)
    database_name (varchar(50), not null)
    table_name (varchar(50), not null)
    old_record (text, null)
    new_record (text, null)
    J'ai donc pensé à créer un trigger qui viendrait mettre à jour cette table à chaque fois qu'on fait un insert, update ou delete dans une autre db.
    Jusque là, pas de souci (créer un trigger, c'est pas bien dur).

    Le truc c'est que, étant un gros fainéant, je n'ai pas envie de m'amuser à faire sur chaque table de chaque DB right clic > new trigger et ensuite copier/coller le code en changeant le nom des DB et table.

    Je cherche donc comment créer en une seule opération un trigger sur chaque table de chaque DB. Je présume qu'il doit bien avoir un moyen mais n'ayant jamais eu de formation (j'ai tout appris plus ou moins sur le tas), je patauge.

    Quelqu'un pourrait-il m'aiguiller pour trouver la marche à suivre ?

    Merci d'avance.

    Griftou.
    Kropernic

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Construisez dynamiquement le script de création du trigger en faisant un select sur information_schema.tables.

  3. #3
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Je veux bien que j'ai dit que créer un trigger n'était pas bien dur (avec sql server management studio, y a presque rien à faire) mais là je suis perdu.

    Pourriez-vous développer un peu plus ?
    Kropernic

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Tu comptes le récupérer où "username" ?
    Most Valued Pas mvp

  5. #5
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Ah merde ! Bien vu !
    J'avais déjà virer le champ application à cause de ça...

    Mmh... je suppose que je peux le retirer dans la mesure où, dans la plupart des applis (à terme dans toutes), j'ai déjà un champ username pour savoir qui a fait la dernière modification sur le record.

    Par extension, j'aurai donc le username dans l'ancien ou le nouveau record selon le cas.
    Kropernic

  6. #6
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Note par rapport à mon post précédent :

    Si je savais comment créer des users sur les db, je pourrais créer un user pour chaque utilisateur de l'application et je pourrais donc récupérer le username dans la requête puisqu'il s'agira du user connecté au server (je ne sais pas encore comment mais je suis persuadé que c'est accessible).

    Donc en théorie c'est possible mais dans la pratique, ce n'est pas (encore) possible dans mon cas.
    Kropernic

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Est-ce que les query qui modifient les données existent déjà ?
    Si oui, peux-tu encore les modifier ?

    Il serait intéressant qu'on connaisse les libertés que tu as.
    Most Valued Pas mvp

  8. #8
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Tout d'abord, merci pour la réponse.

    Ensuite bin... Oui les queries existent mais il s'agit de requêtes faites par des application .NET.

    Le but était de ne pas modifier les applications existantes et aussi de ne pas devoir ajouter du code dédier au logging dans les nouvelles applications.

    De tout faire via trigger. En soit, c'est pas dur. After insert, je colle le nouveau record dans la db en mettant les valeurs du record dans le champ "new_record" et "old_record" à null, l'inverse pour delete et pour update, je pense que vous aurez devinez.

    Ce n'est pas bien dur de faire le trigger pour une table. Mais le truc c'est que j'aimerais faire tous les triggers d'un coup...

    Je sais même pas si c'est possible en fait mais j'imagine que oui...

    J'avais pensé à écrire une procédure avec 2 boucles for each imbriquée qui itéreraient pour chaque db et pour chaque table (sauf la db de log). Mais là encore, va falloir que je bouquine un peu ce langage là car ça fait 2 ans que je ne fais plus que du .NET.

    Griftou.
    Kropernic

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Ok.

    Par ailleurs si tu envisages un nombre important de records, tu devrais ne pas employer tant de varchar comme clé.

    Crée une table "Databases" : id (pk identity) + nom
    Crée une table "Table" : id (pk identity) + nom + dbid (fk vers "Databases")

    Ta table principale deviendrait :
    timestp (PK, timestamp, NOT NULL)
    username (varchar(50), NOT NULL)
    old_record (text, NULL)
    new_record (text, NULL)
    table_id (FK, INT, NOT NULL)


    Si tu n'as pas envie d'en faire de trop, pense quand même à ce que tu risques de devoir faire plus tard si tes mécanismes sont à l'antipode d'une bonne pratique.
    Most Valued Pas mvp

  10. #10
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Bin ce n'est pas que je n'ai pas envie d'en faire trop, c'est juste que je n'ai jamais eu aucune formation sur le sujet.

    Donc si c'est vraiment mieux niveau performance, j'utiliserai ta structure.

    Mais ça ne résoud tjs pas mon problème de création de trigger ^^
    Kropernic

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Vous trouverez toutes les informations nécessaire à cette fonction dans les articles que j'ai écrit pour SQL Server Magazine ( l'an passé.
    On y parle de différentes méthodes de tracabilité d'évolution des données, y compris avec les noms des utilisateurs et même la MAC ADDRESS du PC client !

    L'un de mes articles est d'ailleurs en ligne ici :
    http://blog.developpez.com/sqlpro/p8...n-des-donnees/

    On y créé automatiquement les triggers pour les tables concernées à l'aide de triggers DDL.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  12. #12
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    J'étais en congé fin de la semaine dernière.

    Je vais de ce pas lire votre article.

    Un tout grand merci !
    Kropernic

  13. #13
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Bonjour,

    Je suis en train de tester et de comprendre le fonctionnement de la procédure que vous décrivez dans votre article.

    J'en suis au point 2.2 et j'obtiens une erreur lors de l'exécution du script. La voici :
    An explicit value for the identity column in table 'S_TRK.T_TRACKED_DATATYPES_TDT' can only be specified when a column list is used and IDENTITY_INSERT is ON.
    Peut-être est-elle due à une erreur de ma part car j'ai du faire quelques légères modifications. J'entends par là, par exemple, enlever les type date et time qui n'existe pas (plus?) sous sql server 2005. Aussi, quelques détails de syntaxe ont du changer car j'ai du par exemple englober dans des paranthèses les lignes après le mot clé VALUES sans quoi j'obtenais une erreur de syntaxe.

    Bref, toujours est-il que je ne comprends pas l'erreur en question. On dirait qu'il essaie d'ajouter le nom des datatypes dans le champ TDT_ID au lieu du champ TDT_DATATYPE. L'id est pourtant bien défini comme identité avec un auto incrément. Je sais que quand je fais mes insert, j'ignore également ce type de champ et tout se passe très bien. Donc quid de cette erreur ?

    Griftou.

    P.S. : Pour info, voici le script après les modifications d'adaptations à ma version de sql server
    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
    --===========================================================================-- 
    -- 2 : alimentation de la liste des tables et des types de données historisés 
    --===========================================================================-- 
     
    -- voici comment ou alimente la table des tables à suivre : 
    INSERT INTO S_TRK.T_TRACKED_TABLES_TBL (TBL_SCHEMA, TBL_NAME) 
    SELECT TABLE_SCHEMA, TABLE_NAME 
    FROM   INFORMATION_SCHEMA.TABLES 
    WHERE  TABLE_TYPE = 'BASE TABLE' 
    -- on évitera d'auditer les tables d'audit ! 
      AND  TABLE_SCHEMA + '.' + TABLE_NAME  
           NOT IN ('S_TRK.T_TRACKED_TABLES_TBL',  
                   'S_TRK.T_TRACKED_DATACHANGES_TKC', 
                   'S_TRK.T_TRACKED_DATATYPES_TDT'); 
    -- vous pouvez exclure certaines autres tables de l'historisation 
    --  AND  TABLE_NAME   NOT IN (...) 
    --  AND  TABLE_SCHEMA NOT IN (...)                
     
    -- on évitera de spécifier les types BLOBS ou des types complexes (XML, UDT, types RO...). 
    INSERT INTO S_TRK.T_TRACKED_DATATYPES_TDT 
    VALUES (('char'), ('varchar'), ('nchar'), ('nvarchar'), 
           ('decimal'), ('numeric'), ('float'), ('real'), ('int'), ('smallint'), ('bigint'), 
    -- types sépcifiques SQL Server :        
           ('datetime'), ('smalldatetime'), ('datetimeoffset'),  
           ('money'), ('smallmoney'), 
           ('tinyint'), 
           ('bit')); 
    GO
    Kropernic

  14. #14
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Bon, j'ai pigé l'erreur (suis un gros naze en fait ^^).

    Les paranthèses autour de tout ce qu'il y a après VALUES, c'est mal.
    Mais pourquoi est-ce que je reçois une erreur de syntaxe alors... C'est quoi la syntaxe correct pour ajouter plusieurs lignes ?

    J'ai été voir dans l'aide de sql server et si on en croit ce qui est écrit, ce n'est possible qu'avec une subquery...

    Donc je fais quoi moi ?

    Griftou.

    P.S. : En attendant, j'ai fait ajouter moi-même les données dans la table mais bon, ça pue quoi... J'veux comprendre pourquoi ça foire.

    EDIT : Une recherche sur google m'a permis de voir qu'il fallait virer VALUES et mettre un select devant chaque bloc de () et de mettre union all entre les lignes a joutées. C'est encore microsoft qui a eu envie de ne pas faire comme tout le monde ou bien un truc spécifique que j'ignore ou n'ai pas compris ?
    Kropernic

  15. #15
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    J'ai finalement réussi.

    Un tout grand merci à SQL PRO et ses articles sans lesquels je n'y serais jamais arrivé.

    Il m'a fallu un paquet de temps pour les comprendre et arrivé à les bidouiller pour que ça fasse ce que je voulais mais j'y suis finalement arrivé. Enfin presque. Je voulais à la base que ça créée les triggers non seulement pour chaque table mais aussi pour chaque db.

    Finalement, ça le fait dans une db données et je me dis que ce n'est pas plus mal.

    Bref, j'suis super fier de moi

    Merci encore à tous !

    Griftou.
    Kropernic

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

Discussions similaires

  1. sql server 2005 et les triggers
    Par miche19000 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 30/06/2010, 18h19
  2. Réponses: 2
    Dernier message: 11/06/2009, 08h55
  3. [SQL SERVER 2005] Espace disque insuffisant pour un RESTORE
    Par ben_harper dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/03/2009, 10h39
  4. [SQL Server 2005] Besoin d'aide pour requête
    Par Definol dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/07/2007, 13h55
  5. Réponses: 5
    Dernier message: 13/10/2006, 08h00

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