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 :

Forcer une valeur NULL


Sujet :

MS SQL Server

  1. #1
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut Forcer une valeur NULL
    * Bonjour, *

    La demande est un peu bizarre mais imaginons une base alimentée par un CRM.
    Pour des besoins particuliers, je souhaite que, même si le CRM souhaite remplir une colonne, je force la valeur à NULL et cela sans avoir un retour d'erreur du moteur.

    A part utiliser un trigger after, il y a une autre solution ?
    J'essaye avec les contraintes, mais lorsque j'essaye d'insérer, il refuse complètement la ligne et me retourne une erreur, ce qui est normal.

    * Merci *

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    A part utiliser un trigger after, il y a une autre solution ?
    plutôt un trigger instead of :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE TRIGGER [dbo].[MonTrigger]
       ON  [dbo].[MaTable]
       INSTEAD OF INSERT
    AS 
    BEGIN
     
    	INSERT INTO MaTable(A,B)
    	SELECT NULL, B
    	FROM INSERTED
    END

  3. #3
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    C'est vrai, c'est peut-être mieux avec instead of.
    Je n'ai pas précisé mais ça peut être en cas d'insert ou d'update.

    mais l'idée est tout de même de ne pas utiliser de trigger du tout si possible ?

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Quel serait le besoin "après" d'avoir cette colonne nulle ?

  5. #5
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Le CRM met à jour cette colonne automatiquement, alors que dans le cas de ce paramétrage précis, pour ce client, je ne veut pas qu'il puisse modifier cette valeur.
    Sans avoir la possibilité d'agir sur le CRM à ce niveau, je comptais le faire au niveau SQL, si possible sans trigger.

  6. #6
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 100
    Points : 31 538
    Points
    31 538
    Billets dans le blog
    16
    Par défaut Vessie ou lanterne
    Un moyen d'éviter les mises à jour d'une colonne est de leurrer le CRM en lui faisant prendre une vessie pour une lanterne, c'est-à-dire de lui faire mettre à jour une vue plutôt qu'une table de base, vue dans laquelle ne figurent pas les noms des colonnes justement interdites de mise à jour.

    Le sage Waldar a-t-il une opinion à ce sujet ? Peut-être que le bouillant SQLpro a rédigé des billets en ce sens ?

  7. #7
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    N'étant ni sage ni bouillant j'émetterais quand même mon humble avis

    Un moyen d'éviter les mises à jour d'une colonne est de leurrer le CRM en lui faisant prendre une vessie pour une lanterne, c'est-à-dire de lui faire mettre à jour une vue plutôt qu'une table de base, vue dans laquelle ne figurent pas les noms des colonnes justement interdites de mise à jour.
    Dans ce cas je pense qu'une erreur sera provoquée puisque dans la vue la colonne n'existera pas et c'est peut être ce que Jinroh77 ne veux pas.

    ++

  8. #8
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 100
    Points : 31 538
    Points
    31 538
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par mikedavem Voir le message
    N'étant ni sage ni bouillant j'émetterais quand même mon humble avis

    Dans ce cas je pense qu'une erreur sera provoquée puisque dans la vue la colonne n'existera pas et c'est peut être ce que Jinroh77 ne veux pas.
    Je n'avais pas pensé à vous, et je bats ma coulpe, mais mon but est surtout de faire avancer le Schimilimili dans la détente et la bonne humeur (qualité dont vous n'êtes pas dépourvu)... Il est évident qu'au sens SQL, la mise à jour via une vue pose quelques problèmes. Reste à inviter dans la quête à la bonne solution quelques collègues — liste non limitative — comme elsuket et Luc Orient (M. DB2) dont le bon sens, le sérieux et la compétence ne sont plus à démontrer...

    Quant à votre sagesse, votre modestie dût-elle en souffrir, j'oserai malgré tout la qualifier de proverbiale...

    Vous connaissez ma position vis-à-vis de NULL, mais comme Jinroh77 n’a pas l’air contre son emploi, la séquence suivante devrait le satisfaire, dans le respect de la 6e des 12 règles de Codd :

    Code SQL : 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
    CREATE TABLE T
    (
            Tid        Int           NOT NULL
          , Nom        Varchar(32)   NOT NULL
          , Secret     Varchar(32)   NULL
        , CONSTRAINT T_PK PRIMARY KEY (Tid)
    ) ;
    GO
    CREATE VIEW V 
    AS SELECT  Tid, Nom
       FROM    T
    ;
    GO
    INSERT INTO T VALUES (1, 'Albert', 'top secret') ;
    SELECT '' AS 'T1', * FROM T ;
     
    UPDATE V SET Nom = 'Bernard' WHERE Nom = 'Albert'
    SELECT '' AS 'T2', * FROM T ;
     
    INSERT INTO V VALUES (2, 'Charles') ;
    SELECT '' AS 'T3', * FROM T ;

    Quoi qu'il en soit, même si Jinroh77 n’est pas amateur de triggers, pourquoi ne pas quand même essayer de tricoter vue et trigger pour trouver une solution qui ne fasse pas intervenir NULL dans la déclaration de la table T ?

  9. #9
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 100
    Points : 31 538
    Points
    31 538
    Billets dans le blog
    16
    Par défaut Vue + trigger
    Avec un trigger associé à la vue V, pourquoi pas quelque chose comme ça :


    Code SQL : 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 TABLE T
    (
            Tid        Int           NOT NULL
          , Nom        Varchar(32)   NOT NULL
          , Secret     Varchar(32)   NOT NULL
        , CONSTRAINT T_PK PRIMARY KEY (Tid)
    ) ;
    GO
    CREATE VIEW V 
    AS SELECT  Tid, Nom
       FROM    T
    ;
    GO
    CREATE TRIGGER TRG ON V INSTEAD OF INSERT AS
           INSERT INTO T
                  SELECT Tid, Nom, 'Pas touche'
                  FROM   INSERTED 
    GO
    INSERT INTO T VALUES (1, 'Albert', 'top secret') ;
    SELECT '' AS 'T1', * FROM T ;
     
    UPDATE V SET Nom = 'Bernard' WHERE Nom = 'Albert'
    SELECT '' AS 'T2', * FROM T ;
     
    INSERT INTO V VALUES (2, 'Charles') ;
    SELECT '' AS 'T3', * FROM T ;

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Un question me taraude depuis le début de cette discussion...

    par curiosité Jinroh77, pourquoi est-ce que :
    Citation Envoyé par Jinroh77 Voir le message
    l'idée est tout de même de ne pas utiliser de trigger du tout si possible ?
    ?

  11. #11
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Bonjour,
    Merci à tous vos apports sur cette discussion.
    Je vais voir du côté de la vue si au moins on peut jouer sur le CRM à ce niveau mais je ne suis pas sûr.

    Pour répondre à cette dernière question, l'idée est d'un point de vue performance. J'avais peur qu'à partir d'un CRM générant beaucoup d'activité à ce niveau, le trigger pouvait plus consommer qu'une autre méthode.
    D'où le fait de penser à quelque chose de simple et efficace, mais visiblement ce n'est pas possible.

  12. #12
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    La solution de passer par une vue sans trigger est élégante je trouve (qui respecte bien la 6ème règle de Codd) mais pour cela il faudrait avoir comme hypothèse que Jinroh77 puisse avoir accès au code du CRM concerné.

    ++

  13. #13
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Ne serait-il pas possible de nommer la vue comme la table normalement manipulée et de renommer cette dernière afin de leurrer complètement l'application cliente sans avoir à y toucher ?

  14. #14
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Le problème est que si je fais cela, c'est tout le CRM qui risque de faire la tête.
    La table est utilisée par d'autres traitements interne que je ne préfère pas déranger.

    Pour résumer :
    - soit un triger que l'on essaye de faire propre et rapide.
    - soit d'une manière ou d'une autre, il faut aller modifier le code du CRM pour le faire pointer autre part.

    Merci pour toutes vos idées

  15. #15
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 100
    Points : 31 538
    Points
    31 538
    Billets dans le blog
    16
    Par défaut
    Je ne suis pas du tout spécialiste de SQL Server, mais ne pourrait-on pas envisager la piste de l'instruction GRANT pour autoriser/interdire à tel ou tel process la mise à jour de telle et telle colonnes de la table en question ?

  16. #16
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Si le CRM met à jour cette colonne, ne l'utilises pas également? le fait que sa valeur soit NULL (oups je veux dire son absence de valeur il y à tout le beau monde là il faut faire attention :-)) ne va t'il pas le perturber?

    Les TRIGGER font partie intégrantes des SGBDR, s'il est vrai qu'il faut prêter une attention toute particulière à leur optimisation, leur utilisation est courante et pas forcement contre performante...

  17. #17
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Je ne suis pas du tout spécialiste de SQL Server, mais ne pourrait-on pas envisager la piste de l'instruction GRANT pour autoriser/interdire à tel ou tel process la mise à jour de telle et telle colonnes de la table en question ?
    Oui mais dans ce cas... SQL SERVER remonte une erreur... "ce qui est bien, mais pas TOP"

  18. #18
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Citation Envoyé par iberserk Voir le message
    Oui mais dans ce cas... SQL SERVER remonte une erreur... "ce qui est bien, mais pas TOP"
    Exactement

  19. #19
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Une vue avec un INSTEAD OF trigger me semble la solution dans ce cas...

Discussions similaires

  1. Forcer affichage d'une valeur nulle
    Par francoisK dans le forum Webi
    Réponses: 10
    Dernier message: 27/07/2007, 16h17
  2. forcer l'affichage d'une valeur null
    Par sundjata dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 23/11/2005, 09h52
  3. [vb.net] tester une valeur nulle de maniere elegante
    Par graphicsxp dans le forum Windows Forms
    Réponses: 5
    Dernier message: 22/08/2005, 15h36
  4. Affcecter une valeur NULL dans une requete paramétrée
    Par thiouwz2 dans le forum Bases de données
    Réponses: 7
    Dernier message: 05/11/2004, 15h02
  5. Passer une valeur Null dans un argument de procédure
    Par preempalver dans le forum VBA Access
    Réponses: 5
    Dernier message: 30/12/2003, 20h52

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