|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : janvier 2007 Messages : 11 ![]() |
Bonjour,
J'ai a pour ma culture perso un peu réfléchis à l’excellent article de SQLpro sur l'historisation de données au passage merci pour le partage .Mon problème réside dans l'implémentation de la partie du trigger qui permettre de modifier des colonnes d'une table d'historisations pour suivre les alter(nom, type...) de la table de production d'un point de vue ensembliste. Parce comme fourni on a les colonnes impacter par la modification leur nature ainsi que les différentes manipulations qu'elle on subit (ouf !). Je vois comment exploiter les informations par curseur ou avec une table temporaire (comme le présente encore SQLpro ici point 3). Mais avec la procédure sp_rename ou par colonne temporaire (ici et oui encore merci) sa ressemble plus à du fonctionnel (boucle sur les colonnes...). Mais auriez-vous des pistes de réflexions pour respecter le point de vu ensembliste dans ce cas ? Des exemples de mécanismes similaires ? |
|
|
01
|
|
|
#2 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
Il suffit de capturer les commandes SQL ALTER, changer le nom de la table et les relancer pour la nouvelle table.
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : janvier 2007 Messages : 11 ![]() |
Hum ok merci.
Mais en terme de "capturer les commandes SQL ALTER" je dois chercher du coter du contenu du EVENTDATA() (je connais pas trop cette bête là!) Ou plutôt par comparaison de tables je recrée les modifications ? |
|
|
00
|
|
|
#4 | ||||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 670 ![]() |
Bonjour,
Je ne suis pas sûr d'avoir complètement compris ce que vous cherchez à faire : - simplement suivre les instructions ALTER TABLE - capturer l'instruction ALTER TABLE pour l'exécuter sur la table d'audit des modifications - les deux ? Quoi qu'il en soit, voici un exemple d'utilisation de EVENTDATA(). Voici une table de test : Et le trigger d'audit au niveau base de données Code :
Code :
Vous aurez éventuellement besoin de la méthode XQuery nodes() Notez que si vous êtes sous SQL Server 2008 Enterprise ou Developer, vous pouez utiliser la fonctionnalité Change Data Capture, plus simple à mettre en place et plus légère @++; )
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||||
|
00
|
|
|
#5 | ||||
|
Invité de passage
![]() Inscription : janvier 2007 Messages : 11 ![]() |
merci pour les infos.
Je m'explique en fait j'essaie de faire ce qui présenter dans cet article. A savoir: 1 A l'ajout d'une table de prod je crée une table d'historisation dans une deuxième base par trigger: Concrètement: Code :
Concrètement: (attention il est très sale mais encoure de modification toute subjection est la bien venu) Code :
Tout semble fonctionnel "en manuel" (j'entends par la le même code que j’exécute hors trigger) avec les un peu gore pour le deuxième trigger mais fonctionnel. Mon problème c'est que quand tout est en automatique si dans mes modification de table je passe par l'interface graphique et que je modifie un type de colonne il me généré une erreur assez embêtante parce qu'elle me supprime tout simplement ma table de production ![]() L’erreur dit: "table "test" -Impossible de modifier la table. Soit le paramètre de @objname est ambigu, soit le @objtype déclaré(OBJECT) est incorrect" Je me demande si cela ne viens pas du fait que lors d'une modification de type par l'interface graphique il est réalité crée une table temporaire (comme ici ou quelque chose s'en approchant parce mon trigger de création de table la capter avant que je ne le modifie) et cela je pense en même temps que mon trigger d'alter table du coup ma table de prod n'existe plus entre le début et la fin de mon trigger et du coup mon trigger n'arrive pas aller au bout de son traitement et stop tout les traitements. Ce qui ne ce produit pas si je fais un changement de type par code. Votre avis ? |
||||
|
|
00
|
|
|
#6 | |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 670 ![]() |
Citation:
- changez le type d'une colonne - vous la rendez (non)NULL-able - ajoutez / supprimez une colonne Dès lors effectivement votre transaction plante, et la table source n'existe plus. Si vous êtes certain que vous n'allez jamais qu'ajouter des colonnes aux tables, vous pouvez gérer cela en capturant à l'aide du trigger que je vous ai donné la colonne ajoutée, et en l'ajoutant à la table d'audit. Il faut en plus modifier le(s) trigger(s) correspondants à la volée, et le seul moyen de le faire c'est avec du code T-SQL dynamique : vous créez la chaîne de requête au fil de l'eau, et vous exécutez le code avec sp_executesql ou EXEC(@sql). Dans votre cas EXEC(@sql) est acceptable. Vous pouvez faire pareil lorsqu'une colonne est supprimée, mais dans ce cas vous perdrez les valeurs des colonnes pour les mises à jour antérieures au moment de la suppression de la colonne. Enfin, je suppose donc que vous êtes sous SQL Server 2005 ou 2000 ... @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
|
00
|
|
|
#7 |
![]() ![]() ![]() David BARBARINExpert SQL Server Inscription : août 2005 Messages : 3 724 ![]() |
Quelle version et quelle édition de SQL Server ? Sachez que vous pouvez utiliser les audits à partir de la version 2008 pour trapper ce genre d'événement.
++ |
|
00
|
|
|
#8 |
|
Invité de passage
![]() Inscription : janvier 2007 Messages : 11 ![]() |
Merci pour vos réponse.
Je suis en 2008 (ou 2008r2) express. Donc pas de Change Data Capture. Maintenant je comprend pas trop ce dont vous me parler. Je ne pas tellement envie d'auditer les modifications de mes tables je veu juste que le modification suivent (avec des régles spécifique) ma table d'historisation ce qui fonctionne avec mon trigger. Maintenant je vois pas trop comment faire en sorte que dans le cas ou il y a utilisation d'une table temporaire mon trigger soit tjs fonctionnel. Ni a-t-il pas moyen "d'attendre" que le serveur et finis d'utiliser un table temporaire pour qu'il ré-existe bien un table tel que nommer au lancer du trigger d'alter ? |
|
|
00
|
|
|
#9 |
|
Invité de passage
![]() Inscription : janvier 2007 Messages : 11 ![]() |
Bonjour,
En fait le problème venais bien du fait qu'il a création d'une table temporaire quand on modifie par l'interface graphique. Mais pas du fait que mon trigger voyer sa table de référence disparaître en cour de traitement pour la bonne et simple raison que le trigger ce fait "AFTER" il ne peu pas en tout logique perdre sa table. Le serveur fais plutot sa quand on modifie le type d'une colonne. Creation table Tmp -> Alter table Tmp -> transfert table origine Creation new table -> Alter new table -> transfert table alter Mon problème venais du "alter table Tmp" enfin je pense puisque j'ai virer le traitement sur les tables Tmp et maintenant tout semble fonctionner. je reviendrai donc vous proposer ma solutions complète si sa peus aider |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com