p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Membre du Club Avatar de Nadinette
    Femme Profil pro
    Développeur Web
    Inscrit en
    octobre 2012
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2012
    Messages : 104
    Points : 63
    Points
    63

    Par défaut Interdire à un utilisateur de faire partie de deux groupes (appartenance = jointure)

    Bonjour,

    J'espère que tout le monde va bien

    J'ai un nouvel os à ronger et peut-être pourrez-vous m'aider...

    J'ai un utilisateur A qui peut potentiellement apartenir à deux groupes G1 ou G2 mais il ne doit pas pouvoir être à la fois dans G1 et dans G2.

    Comme ça d'instinct, je pense à faire une contrainte check mais à la vue de ce que j'ai lu, je n'ai pas l'impression que ça soit facile.

    Mon chef de projet m'a dit de ne pas utiliser un trigger.

    D'après vous, pour une telle contrainte, vaut-il mieux utiliser une contrainte Check ou un trigger ?

    Si c'est la contrainte check j'aimerais bien avoir un lien vers un exemple

    Merci

  2. #2
    Rédacteur
    Avatar de SQLpro
    Homme Profil pro
    Expert SGBDR & SQL
    Inscrit en
    mai 2002
    Messages
    14 646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Expert SGBDR & SQL
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 14 646
    Points : 32 532
    Points
    32 532

    Par défaut

    Tout dépend de votre modèle de données...
    Si G1 et G2 sont deux tables différentes ce n'est pas la même chose que si G1 et G2 sont des données de la même table.

    Sand ls description de vos tables sous forme DDL (CREATE TABLE...) impossible de vous répondre !

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

  3. #3
    Membre du Club Avatar de Nadinette
    Femme Profil pro
    Développeur Web
    Inscrit en
    octobre 2012
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2012
    Messages : 104
    Points : 63
    Points
    63

    Par défaut

    Salut,

    Meaculpa pour ma mauvaise formulation...

    En fait, G1 et G2 sont des tables différentes et j'ai lu que les contraintes check ne s'appliquaient qu'aux champs d'une même table, j'ai donc convaincu mon CDP de passer par un trigger et ça fonctionne.

    Voici le code :

    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
     
    create or replace
    trigger 
    	TRG_SEQ_T_SEC_USERINTRADEBOOK     
    before insert on 
    	"T_SEC_USERINTRADEBOOK"    
    REFERENCING NEW as New OLD as Old
    FOR EACH ROW 
    DECLARE
      cnt Number(10,0);
      BEGIN
          SELECT count(*) INTO cnt FROM T_SEC_USERINSALESTEAM 
          WHERE T_SEC_USERINSALESTEAM.FK_T_SEC_USER = :NEW."FK_T_SEC_USER";
          if cnt > 0 then 
            raise_application_error (-20000,'User already in a sales team'); 
          end if;
          SELECT count(*) 
            INTO cnt 
          FROM T_SEC_USERINROLE I INNER JOIN 
            T_SEC_ROLE R ON I.FK_T_SEC_ROLE = R.ID 
          WHERE R.TRADEBOOKALLOWED = 1 AND I.FK_T_SEC_USER = :NEW."FK_T_SEC_USER";
          if cnt < 1 then 
            raise_application_error (-20001,'User must be in a role allowing to be in a trade book'); 
          end if;
          if :NEW."ID" is null then          
            select SEQ_T_SEC_USERINTRADEBOOK.nextval into :NEW."ID" from dual;       
          end if;          
      END;
    Merci pour ton intéret pour ma question

    Bonne journée

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/11/2013, 19h36
  2. Réponses: 3
    Dernier message: 31/10/2012, 10h56
  3. comment faire pour aligner deux partie d'une table enboitée
    Par felosa dans le forum Mise en page CSS
    Réponses: 10
    Dernier message: 27/05/2008, 21h03
  4. Peut on faire un selon à deux conditions ?
    Par Celia1303 dans le forum Général Algorithmique
    Réponses: 2
    Dernier message: 18/10/2005, 16h16
  5. Réponses: 3
    Dernier message: 12/05/2005, 18h26

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