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 BEFORE avec SQL-Server


Sujet :

Développement SQL Server

  1. #1
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 051
    Par défaut Trigger BEFORE avec SQL-Server
    Bonsoir,

    J'ai vu dans des vidéos sur le SQL qu'il n(y a pas de trigger BEFORE sur SQL-Server.

    Vu que cela existe dans MySQL par exemple, je suis surpris que ce ne soit pas le cas dans SQL-Server.

    1ère question : Est-ce vraiment le cas ?
    2ème question : dans ce cas pourquoi ?
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  2. #2
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    916
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Septembre 2016
    Messages : 916
    Par défaut
    Bonsoir Christophe,

    Quand on constate un manque faut se demander ce que ça va couter de devoir s'en passer.

    Quels sont les usages qui nécessiteraient d'avoir des trigger before ?
    Le savoir est une nourriture qui exige des efforts.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 963
    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 963
    Billets dans le blog
    6
    Par défaut
    les déclencheurs BEFORE n'ont en pratique aucun intérêt puisque, par nature, les données ne sont pas encore intégrées.
    Par conséquent :
    1) pas de valeurs de la clé si elle est auto-incrémentée
    2) pas de validation des contraintes
    3) pas de ROLLBACK physique possible puisque la transaction effective n'a pas démarrée...

    En revanche, il est possible d'utiliser des déclencheurs "INSTEAD OF" suivant ce que vous voulez faire...

    Expliquez nous ce que vous voulez faire exactement et on vous guidera....

    MySQL est une grosse merde en la matière et fait du n'importe quoi....

    Pour information, c'est SQL Server (à l'époque sous Sybase) qui a inventé la notion de déclencheur.....

    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/ * * * * *

  4. #4
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 051
    Par défaut
    les déclencheurs BEFORE n'ont en pratique aucun intérêt puisque, par nature, les données ne sont pas encore intégrées.
    Ca je peux entendre. Par contre j'en vois un : intercepter un insert et ne pas le faire (ou le faire) selon conditions définies par le trigger.

    Si je met de coté MySQL, Oracle, PostGreSQL gèrent les triggers BEFORE. Je me dit donc qu'il y a une raison

    Vu que ça existe dans certains SGBDR je pourrais modifier la phrase en disant plutôt "les déclencheurs BEFORE ont en pratique peu d'intérêt", non ?

    Pour information, c'est SQL Server (à l'époque sous Sybase) qui a inventé la notion de déclencheur....
    Merci pour le cours d'histoire.

    Expliquez nous ce que vous voulez faire exactement et on vous guidera....
    Pas de projet précis, juste de l'apprentissage.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 463
    Billets dans le blog
    10
    Par défaut
    Le trigger "instead of" peut tout à fait faire l'insert ou faire tout autre chose selon les conditions définies dans son code

    Avec DB2 for Z/OS, un intérêt du TRIGGER "before" est de désactiver les autres déclencheurs, je ne sais pas si c'est aussi le cas avec MySQL.

  6. #6
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    916
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Septembre 2016
    Messages : 916
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Avec DB2 for Z/OS, un intérêt du TRIGGER "before" est de désactiver les autres déclencheurs
    Pour moi, un déclencheur se ramène à une contrainte procédurale.

    Déjà, désactiver une contrainte me pose toujours question, même quand c'est "pour les perfs".
    Normalement la désactivation porte sur la contrainte elle même, et non pas "pour celui qui la désactive".
    Du coup, la maitrise du contexte devient un élément très important avant de se lancer dans ce genre de manœuvre ; et ce pour les contraintes standards.

    Mais, si c'est pour désactiver de manière programmée, l'exécution de code qu'on maitrise, là je n'en vois pas l'utilité.
    A part brouiller les pistes lors du débogage et faire chier ceux qui viennent après, je ne vois pas; Désolé.
    Le savoir est une nourriture qui exige des efforts.

  7. #7
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    916
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Septembre 2016
    Messages : 916
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    Par contre j'en vois un : intercepter un insert et ne pas le faire (ou le faire) selon conditions définies par le trigger.
    Justement, parlons des conditionnelles qui sont accessibles lors de l'exécution du TRIGGER BEFORE.
    Que peut-on faire exactement ?
    Le savoir est une nourriture qui exige des efforts.

  8. #8
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 051
    Par défaut
    Je ne comprend pas la question
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  9. #9
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    916
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Septembre 2016
    Messages : 916
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    Je ne comprend pas la question
    Bonjour chrtophe,

    J'imagine que c'est à propos de :
    Citation Envoyé par Michel.Priori Voir le message
    Justement, parlons des conditionnelles qui sont accessibles lors de l'exécution du TRIGGER BEFORE.
    Que peut-on faire exactement ?
    Chez Oracle les triggers BEFORE et AFTER comportent un paramètre supplémentaire FOR EACH ROW.
    En fonction de ce paramètre les conditionnelles possibles sont différentes ; sans ces mots clés, pas d'accès aux données, donc pas de clause where sur une valeur du lot de données candidates.
    Et même avec ces mots clé, tout n'est pas permis ; Oracle n'apprécie pas les mutants

    Si on remonte le fil de la conversation, la question n°2 qui demande pourquoi il n'existe pas de Trigger BEFORE sous SQL c'est vu objecter son utilité du fait du trigger INSTEAD OF.

    Je reste sur ma demande initiale :
    Citation Envoyé par Michel.Priori Voir le message
    Quand on constate un manque faut se demander ce que ça va couter de devoir s'en passer.
    Quels sont les usages qui nécessiteraient d'avoir des trigger before ?
    Le savoir est une nourriture qui exige des efforts.

  10. #10
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 051
    Par défaut
    Je suis un peu largué, SQL n'est pas mon domaine de compétences. J'en fait un peu mais du SQL simple.

    De ce que je comprends, on peut se passer de BEFORE en utilisant INSTEAD OF. Mais dans ce cas, pourquoi des SGBD tels qu'Oracle ont implémenté BEFORE ce que n'a pas fait SQL-Server ? Pourquoi intégrer quelque chose qui n'a pas d’intérêt ?
    Si c'est juste un choix "politique", je peux comprendre.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  11. #11
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    916
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Septembre 2016
    Messages : 916
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    Mais dans ce cas, pourquoi des SGBD tels qu'Oracle ont implémenté BEFORE ce que n'a pas fait SQL-Server ? Pourquoi intégrer quelque chose qui n'a pas d’intérêt ?
    Ca c'est une question qui faut poser aux éditeurs.

    Cependant voici quelques constatations :
    * Oracle garanti une compatibilité du code. Une fois intégré, ça reste.
    * MySQL n'a toujours pas implémenté les triggers instead of
    * Postgres implemente de manière restreinte les triggers intead of
    INSTEAD OF triggers may only be defined on views, and only at row level; they fire immediately as each row in the view is identified as needing to be operated on.
    Le savoir est une nourriture qui exige des efforts.

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 963
    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 963
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    Je suis un peu largué, SQL n'est pas mon domaine de compétences. J'en fait un peu mais du SQL simple.

    De ce que je comprends, on peut se passer de BEFORE en utilisant INSTEAD OF. Mais dans ce cas, pourquoi des SGBD tels qu'Oracle ont implémenté BEFORE ce que n'a pas fait SQL-Server ? Pourquoi intégrer quelque chose qui n'a pas d’intérêt ?
    Si c'est juste un choix "politique", je peux comprendre.
    Le seul intérêt des triggers BEFORE était de permettre d'ajouter une valeur de clé pour que l'insertion soit valide. Valeur de clé généré par une séquence (auto incrément indirect).

    Or le premier SGBDR a intégrer l'auto incrément direct à été Sybase SQL server avec IDENTITY, rendant inutile les déclencheurs BEFORE.

    Au sujet de l'intérêt d'activer ou désactiver d'autres déclencheurs par un déclencheur BEFORE, ce problème est aussi résolu par le fait que, dans SQL Server, dès l'origine, vous pouvez mettre autant de déclencheur AFTER que vous le souhaitez et piloter l'ordre d'exécution en choisissant celui qui sera le premier et/ou le dernier à l'aide de la procédure sp_settriggerorder

    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/ * * * * *

  13. #13
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 051
    Par défaut
    C'est plus clair maintenant.

    Merci à vous.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

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

Discussions similaires

  1. Pour débuter avec SQL Server : les triggers
    Par asprogramer dans le forum Développement
    Réponses: 2
    Dernier message: 02/04/2010, 05h44
  2. Triggers sur insertion avec SQL Server 2005
    Par Naail dans le forum Développement
    Réponses: 14
    Dernier message: 01/07/2009, 16h23
  3. Trigger update avec sql server 2005
    Par tortuegenie dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 21/02/2009, 23h01
  4. souci avec trigger -- before en ms server?
    Par bibi_forever dans le forum Développement
    Réponses: 3
    Dernier message: 22/05/2007, 12h10
  5. Créer un trigger "before insert" avec SQL Server
    Par bubi dans le forum Développement
    Réponses: 2
    Dernier message: 14/11/2005, 11h12

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