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 :

CREATE RULE ,CREATE DEFAULT exemple probleme comprehension


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de mihaispr
    Inscrit en
    Décembre 2008
    Messages
    1 025
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 025
    Par défaut CREATE RULE ,CREATE DEFAULT exemple probleme comprehension
    Salut a tous et merci pour lire ma question!

    Je veux faire un exemple complet (creation base de donnee, avec une table) un exemple qui utilise CREATE DEFAULT et CREATE RULE en sql server.

    Donc le but c'est comment creer ("default et rule") et aussi "binding a rule" and "binding a default" a l'aide des 2 procedures stoques :

    sp_bindefault et sp_bindrule



    L'exemple que je desire faire c'est pour entendre mieux le fonctionnement de ces 2 clauses.

    Si vous pouvez corriger l'exemple fourni ou donner un autre exemple plus facile a comprendre qui utilise CREATE RULE et CREATE DEFAULT je serais tres content.


    Voila mon example (en esperant qu'il est bon pour utiliser ce que je veux apprendre CREATE RULE et CREATE DEFAULT):




    Ce que j'ai compris sur default:

    - sont definis une seul fois

    - on peut faire un bind default sur des colonnes multiples (la notiong de bind en anglais binding a rule et binding a default n'est pas claire pour moi)

    Ce que j'ai compris sur les regles:

    Extrait en anglais:

    "Rules specify the acceptable values that you can insert into a column.They ensure that data falls within a specified range of values!!! ,matches a particular pattern, or matches entries in a specified list. Consider those facts about rules:
    - A rule definition can contain any expression that is valid in a WHERE clause
    - A column or user-defined data type can have only one rule that is bound to it
    "
    Voila le contenu complet de l'application ListeClients.sql:

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    CREATE DATABASE ListeDesClients
     
    CREATE TABLE Clients
    (NomClient varchar(200),
    PrenomClient varchar(200),
    AgeClient int,
    SexeClient varchar(2),
    LocaliteClient varchar(200),
    Telephone int
    )
     
     
    --convertir la variable int dans un varchar qui contient le prefixe suivi par le ---numero de telephone
    INSERT INTO Clients
    VALUES ('Fontaine','Bernard',22,'H','PH',CAST(Telephone AS varchar(200))
    ,'000-0244-192332');
     
     
    INSERT INTO CLIENTS
    VALUES ('Fontaine','Pierre',22,'H','PH',CAST(Telephone AS varchar(200))
    ,'000-0244-192322');
     
    INSERT INTO CLIENTS
    VALUES ('Fontaine','Jeremy',22,'H','PH',CAST(Telephone AS varchar(200))
    ,'000-0244-182352');
     
    -- creation d'un prefixe default pour la localite PH on a 000-0244
    -- pour la localite B on a le prefixe 000-0312 suivi par le numero de telephone
     
    -- PH et B sont 2 noms de localites
     
    CREATE DEFAULT phone_no_default
    AS '000-0244-0000' 
     
    GO
    --binding a default
    EXEC sp_bindefault phone_no_default, 'Clients.Telephone'
     
    CREATE RULE regioncode_rule
    AS @regioncode IN(‘IA’,’IL’,’KS’,’MO’)
    GO
    EXEC sp_bindrule regioncode_rule, 'Clients.Telephone'
    Je veux comprendre le fonctionnement du CREATE DEFAULT et CREATE RULE dans un exemple concret.

    En esperant que l'exemple c'est bon j'attends vos reponses!

    Amicalment,

    Michel

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Beaucoup d'erreurs....

    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
    CREATE DATABASE ListeDesClients;
    GO
    
    USE ListeDesClients; --> sans cela vous créez vos tables dans master !
    GO
     
    CREATE TABLE dbo.Clients --> n'oubliez pas le préfixe de schema des objets
    (NomClient varchar(200),
    PrenomClient varchar(200),
    AgeClient int,
    SexeClient varchar(2),
    LocaliteClient varchar(200),
    Telephone int
    );
    GO
    On créé les défaut et règles AVANT toute insertion !

    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
    CREATE DEFAULT phone_no_default
    AS '000-0244-0000' 
    GO
    
    --binding a default
    EXEC sp_bindefault phone_no_default, 'Clients.Telephone'
    GO
    
    CREATE RULE regioncode_rule
    AS @regioncode IN(‘IA’,’IL’,’KS’,’MO’)--> QU'est ce que ce charabia ? on est pas sous MySQL et ses accents tordus pour délimiter des colonnes
    GO
    Msg*102, Niveau*15, État*1, Procédure*regioncode_rule, Ligne*2
    Syntaxe incorrecte vers '&'.
    
    
    CREATE RULE regioncode_rule
    AS @regioncode IN('IA, 'IL, 'KS', 'MO')
    GO
    
    EXEC sp_bindrule regioncode_rule, 'Clients.Telephone'
    Voici un exemple plus simple et compréhensible :

    -- préparation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE DATABASE DB_TEST;
    GO
     
    USE DB_TEST;
    GO
    -- création des défaut et règles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE DEFAULT DF_SEXE
    AS 'Homme';
    GO
     
    CREATE RULE RL_SEXE
    AS @SEXE IN ('Homme', 'Femme');
    GO
    -- création table et lien avec règle et défaut pour la colonne PRS_SEXE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE dbo.T_PERSONNE_PRS
    (
    PRS_ID             INT NOT NULL IDENTITY PRIMARY KEY,
    PRS_NOM            CHAR(32) NOT NULL,
    PRS_PRENOM         VARCHAR(25),
    PRS_SEXE           CHAR(5)
    );
     
    EXEC sp_bindefault 'DF_SEXE', 'dbo.T_PERSONNE_PRS.PRS_SEXE';
    GO
     
    EXEC sp_bindrule   'RL_SEXE', 'dbo.T_PERSONNE_PRS.PRS_SEXE';
    GO
    -- tests d'insertion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO dbo.T_PERSONNE_PRS ( PRS_NOM,  PRS_PRENOM, PRS_SEXE)
                            VALUES ('DUPONT', 'Marc',     'Homme');
    GO
     
    INSERT INTO dbo.T_PERSONNE_PRS ( PRS_NOM,  PRS_PRENOM, PRS_SEXE)
                            VALUES ('DUFOUR', 'Jean',     'XXXXX');
    GO
    Msg*513, Niveau*16, État*0, Ligne*2
    Conflit de colonne INSERT ou UPDATE avec une règle imposée par une instruction CREATE RULE précédente. L'instruction a été terminée. Le conflit s'est produit dans la base de données 'DB_TEST', table 'dbo.T_PERSONNE_PRS', colonne 'PRS_SEXE'.
    L'instruction a été arrêtée.


    Logique non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO dbo.T_PERSONNE_PRS ( PRS_NOM,  PRS_PRENOM)
                            VALUES ('DUVAL', 'Éric');
    GO
    -- résultat des tests :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * FROM dbo.T_PERSONNE_PRS
     
    PRS_ID      PRS_NOM           PRS_PRENOM     PRS_SEXE
    ----------- ----------------- -------------- --------
    1           DUPONT            Marc           Homme
    3           DUVAL             Éric           Homme
    Mieux !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DROP TABLE dbo.T_PERSONNE_PRS,
    GO
    -- création d'un type de données avec règle et défaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TYPE dbo.TP_SEXE 
       FROM CHAR(5);
     
    EXEC sp_bindefault 'DF_SEXE', 'dbo.TP_SEXE ';
    GO
     
    EXEC sp_bindrule   'RL_SEXE', 'dbo.TP_SEXE ';
    GO
    -- utilisation du type dans la création de la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE dbo.T_PERSONNE_PRS
    (
    PRS_ID             INT NOT NULL IDENTITY PRIMARY KEY,
    PRS_NOM            CHAR(32) NOT NULL,
    PRS_PRENOM         VARCHAR(25),
    PRS_SEXE           dbo.TP_SEXE 
    );
    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/ * * * * *

  3. #3
    Membre éprouvé
    Avatar de mihaispr
    Inscrit en
    Décembre 2008
    Messages
    1 025
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 025
    Par défaut
    Merci beacoup pour l'explication c'est clair maintenant et l'exemple plus simple fourni sqlpro!



    Je marque comme resolu le sujet!

    Une remarque : mon insert ne fonctionne pas pourquoi?

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    CREATE DATABASE ListaClienti; -- creare baza de date ListaClienti
    GO
     
    USE ListeDesClients; -- important ca sa nu creeze bd in master ci in folderul model din mssql 
    GO
     
    -- cream tabela cu numele Clienti asociata bazei de date cu numele ListaClienti
     
    CREATE TABLE dbo.Clienti-- prefixul pt. database schema dbo. este recomandat  
    (NumeClient varchar(200),
    PrenumeClient varchar(200),
    VarstaClient int,
    SexClient varchar(2),
    LocalitateClient varchar(200),
    TelefonClient int
    );
    GO
     
     
     
    -- vom crea default si reguli inainte de inserari in tabela (insert into)
     
    CREATE DEFAULT phone_no_default
    AS '000-0244-0000' -- sa presupunem ca acesta este prefixul pt. judetul Prahova PH
    GO
     
    --binding a default
    EXEC sp_bindefault phone_no_default, 'Clienti.TelefonClient'
    GO
     
     
    CREATE RULE regioncode_rule
    AS @regioncode IN('PH', 'DB', 'B', 'BV')
    GO
     
    EXEC sp_bindrule regioncode_rule, 'Clienti.TelefonClient'
     
    -- inserarea datelor in tabela Clienti
     
    INSERT INTO dbo.Clienti( NumeClient,PrenumeClient,VarstaClient,SexClient,LocalitateClient)
                            VALUES ('Ionescu', 'Jean',29,'M','PH');
    GO
     
    INSERT INTO dbo.Clienti( NumeClient,PrenumeClient,VarstaClient,SexClient,LocalitateClient)
                            VALUES ('Popescu', 'Ion',26,'M','DB');
    GO
     
    INSERT INTO dbo.Clienti( NumeClient,PrenumeClient,VarstaClient,SexClient,LocalitateClient)
                            VALUES ('Popescu', 'Radu',56,'M','B');
    GO
     
    INSERT INTO dbo.Clienti( NumeClient,PrenumeClient,VarstaClient,SexClient,LocalitateClient)
                            VALUES ('Popescu', 'Gabriel',43,'M','BV');
    GO
     
    INSERT INTO dbo.Clienti( NumeClient,PrenumeClient,VarstaClient,SexClient,LocalitateClient)
                            VALUES ('Popescu', 'Rodica',39,'F','BV');
    GO
     
    -- vedem toate inregistrarile tablei clienti
    SELECT * FROM dbo.Clienti
    Je recois cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Msg 245, Level 16, State 1, Line 1
    Conversion failed when converting the varchar value '000-0244-0000' to data type int.
    Msg 245, Level 16, State 1, Line 2
    A l'insert into instruction.

    J'ai essaye de convertir int en varchar avec CAST:

    CAST(TelefonClient AS varchar(200) )

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Vous avez typé la colonne téléphone en INT. et vous essayez d'y rentrer une chaine de caractères....

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

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

Discussions similaires

  1. Probleme comprehension Mysql & c++
    Par cluigi dans le forum C++
    Réponses: 0
    Dernier message: 02/12/2007, 22h59
  2. Probleme comprehension Mysql & c++
    Par cluigi dans le forum C++
    Réponses: 0
    Dernier message: 02/12/2007, 17h59
  3. difference entre grant create & grant create any
    Par bm_oracliste dans le forum Oracle
    Réponses: 2
    Dernier message: 25/11/2007, 08h46
  4. [C++.NET] Probleme comprehension de code
    Par raboin dans le forum VC++ .NET
    Réponses: 3
    Dernier message: 03/05/2006, 12h49
  5. [MSDE] CREATE RULE sur un type utilisateur ?
    Par Raduris dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 05/01/2005, 12h24

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