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 :

Génération d'un script de création de la BDD


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 37
    Points : 31
    Points
    31
    Par défaut Génération d'un script de création de la BDD
    Bonjour,

    Lorsque je génère un script de création de ma BDD qui sera déployé à l'installation de mon application (via SQL Server Management Studio), toutes les tables de la bases sont créées avec les contraintes 'DEFAULT VALUE' définies dans la requête 'CREATE TABLE'.

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE [dbo].[Etablissement](
    	[IDEtablissement] [int] NOT NULL,
    	[NomEtablissement] [varchar](255) NOT NULL,
    	[Adresse] [varchar](255) NOT NULL CONSTRAINT [DF_Etablissement_Adresse]  DEFAULT (''),
    	[Ville] [varchar](255) NOT NULL CONSTRAINT [DF_Etablissement_Ville]  DEFAULT (''),
    	[CodePostal] [varchar](10) NOT NULL CONSTRAINT [DF_Etablissement_CodePostal]  DEFAULT (''),
            .....
    Jusque là tout va bien sauf que sur la cinquantaine de table dans mon script, pour une seule table en particulier, toutes les contraintes des valeurs par défaut ne sont pas dans la requête 'CREATE TABLE' comme ci-dessus mais sont ajoutés dans des 'ALTER TABLE' bien plus loin dans le script.

    Comment cela se fait-il et comment y remédier (hormis en modifiant le script manuellement) ?

    Merci.

  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 736
    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 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Postez le script, mais il y a fort à parier qu'un paramètre de session est différent.

    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 37
    Points : 31
    Points
    31
    Par défaut
    Bonjour,
    Merci d'avoir répondu.
    Je ne peux pas poster le script car il fait des milliers de lignes.
    Un paramètre de session? Quel serait le rapport avec la génération automatique d'un script via SQL Server Management Studio qui se comporte différemment pour une seule table sur la centaine de tables que contient le script?
    Cordialement.

  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 736
    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 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Lorsque qu'un objet est créé par d'un côté un ordre CREATE puis, au cours du développement, complété par un ALTER TABLE, il faut s'assurer que l'état de la session est le même qu'à l'origine du CREATE TABLE, sinon il s'ensuit une séquence du genre :

    SET ??? ON

    SET !!! ON

    CREATE TABE....

    SET ??? OFF

    SET !!! OFF

    ***

    SET *** ON

    ALTER TABLE ...

    SET *** OFF

    En fait les colonnes créées dans le CREATE auront des propriétés différentes de celles créées lors de l'ALTER.

    Cela se produit généralement lorsque l'on a utilisé deux outils différent pour lancer ses requêtes, l'un pour le CREATE, l'autre pour l'ALTER. Par exemple Power AMC puis SSMS !

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

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 37
    Points : 31
    Points
    31
    Par défaut
    Oui, en effet, le problème a l'air de venir de ça. Merci beaucoup pour la piste donnée.
    Par contre si je supprime la table et que je la recréer correctement, j'ai toujours le même souci.

    En effet, j'ai un script avec :
    SET ANSI_PADDING ON
    ...
    CREATE TABLE
    ...
    SET ANSI_PADDING OFF
    ...
    ALTER TABLE [dbo].[Mouvement] ADD CONSTRAINT [DF_Mouvement_DateRetour] DEFAULT ('') FOR [DateRetour]


    Script dans lequel j'ai des alter table pour l'ajout des valeurs par défaut:
    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
    63
     
    /****** Object:  Table [dbo].[Mouvement]    Script Date: 07/09/2016 16:06:30 ******/
    SET ANSI_NULLS ON
    GO
     
    SET QUOTED_IDENTIFIER ON
    GO
     
    SET ANSI_PADDING ON
    GO
     
    CREATE TABLE [dbo].[Mouvement](
    	[IDMouvement] [int] NOT NULL,
    	[TypeMouvement] [tinyint] NOT NULL,
    	[Libelle] [varchar](255) NOT NULL,
    	[DateDepart] [char](8) NOT NULL,
    	[DateRetour] [char](8) NOT NULL,
    	[Remarque] [varchar](max) NOT NULL,
    	[IDPatient] [int] NOT NULL,
    	[CreePar] [int] NOT NULL,
    	[DateCreation] [char](17) NOT NULL,
    	[ModifiePar] [int] NULL,
    	[DateModification] [char](17) NOT NULL,
     CONSTRAINT [PK_IDMouvement] PRIMARY KEY CLUSTERED 
    (
    	[IDMouvement] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
     
    GO
     
    SET ANSI_PADDING OFF
    GO
     
    ALTER TABLE [dbo].[Mouvement] ADD  CONSTRAINT [DF_Mouvement_DateRetour]  DEFAULT ('') FOR [DateRetour]
    GO
     
    ALTER TABLE [dbo].[Mouvement] ADD  CONSTRAINT [DF_Mouvement_Remarque]  DEFAULT ('') FOR [Remarque]
    GO
     
    ALTER TABLE [dbo].[Mouvement] ADD  CONSTRAINT [DF_Mouvement_DateModification]  DEFAULT ('') FOR [DateModification]
    GO
     
    ALTER TABLE [dbo].[Mouvement]  WITH CHECK ADD  CONSTRAINT [FK_Mouvement/Patient] FOREIGN KEY([IDPatient])
    REFERENCES [dbo].[Patient] ([IDPatient])
    GO
     
    ALTER TABLE [dbo].[Mouvement] CHECK CONSTRAINT [FK_Mouvement/Patient]
    GO
     
    ALTER TABLE [dbo].[Mouvement]  WITH CHECK ADD  CONSTRAINT [FK_Mouvement/Utilisateur_CreePar] FOREIGN KEY([CreePar])
    REFERENCES [dbo].[Utilisateur] ([IDUtilisateur])
    GO
     
    ALTER TABLE [dbo].[Mouvement] CHECK CONSTRAINT [FK_Mouvement/Utilisateur_CreePar]
    GO
     
    ALTER TABLE [dbo].[Mouvement]  WITH CHECK ADD  CONSTRAINT [FK_Mouvement/Utilisateur_ModifiePar] FOREIGN KEY([ModifiePar])
    REFERENCES [dbo].[Utilisateur] ([IDUtilisateur])
    GO
     
    ALTER TABLE [dbo].[Mouvement] CHECK CONSTRAINT [FK_Mouvement/Utilisateur_ModifiePar]
    GO
    Donc je supprime la table et je la recréé avec le script suivant:

    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
     
    /****** Object:  Table [dbo].[Mouvement]    Script Date: 07/09/2016 15:52:52 ******/
    SET ANSI_NULLS ON
    GO
     
    SET QUOTED_IDENTIFIER ON
    GO
     
    SET ANSI_PADDING ON
    GO
     
    CREATE TABLE [dbo].[Mouvement](
    	[IDMouvement] [int] NOT NULL,
    	[TypeMouvement] [tinyint] NOT NULL,
    	[Libelle] [varchar](255) NOT NULL,
    	[DateDepart] [char](8) NOT NULL,
    	[DateRetour] [char](8) NOT NULL CONSTRAINT [DF_Mouvement_DateRetour]  DEFAULT (''),
    	[Remarque] [varchar](max) NOT NULL CONSTRAINT [DF_Mouvement_Remarque]  DEFAULT (''),
    	[IDPatient] [int] NOT NULL,
    	[CreePar] [int] NOT NULL,
    	[DateCreation] [char](17) NOT NULL,
    	[ModifiePar] [int] NULL,
    	[DateModification] [char](17) NOT NULL CONSTRAINT [DF_Mouvement_DateModification]  DEFAULT (''),
     CONSTRAINT [PK_IDMouvement] PRIMARY KEY CLUSTERED 
    (
    	[IDMouvement] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
     
    GO
     
    SET ANSI_PADDING OFF
    GO
     
    ALTER TABLE [dbo].[Mouvement]  WITH CHECK ADD  CONSTRAINT [FK_Mouvement/Patient] FOREIGN KEY([IDPatient])
    REFERENCES [dbo].[Patient] ([IDPatient])
    GO
     
    ALTER TABLE [dbo].[Mouvement] CHECK CONSTRAINT [FK_Mouvement/Patient]
    GO
     
    ALTER TABLE [dbo].[Mouvement]  WITH CHECK ADD  CONSTRAINT [FK_Mouvement/Utilisateur_CreePar] FOREIGN KEY([CreePar])
    REFERENCES [dbo].[Utilisateur] ([IDUtilisateur])
    GO
     
    ALTER TABLE [dbo].[Mouvement] CHECK CONSTRAINT [FK_Mouvement/Utilisateur_CreePar]
    GO
     
    ALTER TABLE [dbo].[Mouvement]  WITH CHECK ADD  CONSTRAINT [FK_Mouvement/Utilisateur_ModifiePar] FOREIGN KEY([ModifiePar])
    REFERENCES [dbo].[Utilisateur] ([IDUtilisateur])
    GO
     
    ALTER TABLE [dbo].[Mouvement] CHECK CONSTRAINT [FK_Mouvement/Utilisateur_ModifiePar]
    GO

    Quand je regénère mon script via SSMS, je me retrouve toujours avec le 1er script de ce post.
    Une idée du pourquoi du comment?
    Merci.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    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 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    D'abord il suffit de supprimer la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET ANSI_PADDING OFF
    GO
    Située juste avant le premier ALTER TABLE et rejouer le code pour que cette problématique de différentiation de cession n'existe plus.

    Ensuite pour la séparation CREATE TABLLE puis ALTER il n'y a pas de solution miracle. Si l'on intègre les contraintes d'intégrité à la définition d'une table, il faudrait pouvoir créer les tables dans un ordre logique de dépendance. Or il y a des cas de cycle référentiel qui rendent impossible une telle création, raison pour laquelle il y a une partie du script qui sont tous les CREATE TABLE et une autre qui concerne tous les ALTER TABLE ADD CONSTRAINT FOREIGN KEY ! Cela existe dans tous les outils et n'est pas vraiment contournable....

    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. Réponses: 2
    Dernier message: 07/01/2008, 17h17
  2. Reprise des scripts de création de la BDD
    Par Bindy dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 31/05/2006, 12h15
  3. passage nom des contraintes de MPD au script de création BD
    Par marièmdiaw dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 14/01/2005, 14h18
  4. [IBExpert]Recuperer le script de création de la BD ?
    Par Sitting Bull dans le forum Outils
    Réponses: 2
    Dernier message: 01/10/2004, 12h15
  5. Réponses: 3
    Dernier message: 24/10/2003, 22h46

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