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 :

Equivalent d'un ALTER TABLE ALTER COLUMN DROP DEFAULT en SQL Server


Sujet :

Développement SQL Server

  1. #1
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Août 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 80
    Par défaut Equivalent d'un ALTER TABLE ALTER COLUMN DROP DEFAULT en SQL Server
    Bonjour,

    je souhaiterais pourvoir dropper ou modifier la valeur default d'une colonne,
    malheureusement, SQL Server ne respectant pas la norme et utilise une contrainte dont le nom est générer dynamiquement.

    donc pour retirer la valeur par défaut il faut faire en SQL92 un
    ALTER TABLE t ALTER COLUMN c DROP DEFAULT

    en sql server il faudrait faire un
    ALTER TABLE t DROP CONSTRAINT xxxx

    le problème, comment puis-je retrouver le nom de la contrainte fixant le default d'une colonne dans ma table ne connaissant pas son nom à l'avance?

    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 986
    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 986
    Billets dans le blog
    6
    Par défaut
    malheureusement, SQL Server ne respectant pas la norme et utilise une contrainte dont le nom est générer dynamiquement
    Ou avez vous lu que la norme SQL imposait un nom de contrainte ? Cela n'est pas vrai !

    Voici un l'extrait de la norme sur le ALTER TABLE :

    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
    X3H2-92-154/DBL CBR-002
                                                   11.10 <alter table statement>
     
     
             11.10  <alter table statement>
     
             Function
     
             Change the definition of a table.
     
             Format
     
             <alter table statement> ::=
                  ALTER TABLE <table name> <alter table action>
     
             <alter table action> ::=
                    <add column definition>
                  | <alter column definition>
                  | <drop column definition>
                  | <add table constraint definition>
                  | <drop table constraint definition>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <alter column definition> ::=
                  ALTER [ COLUMN ] <column name> <alter column action>
     
             <alter column action> ::=
                    <set column default clause>
                  | <drop column default clause>
    Comme vous pouvez le constater le "ALTER TABLE t ALTER COLUMN c DROP DEFAULT" n'existe pas dans la norme SQL de 1992.

    Alors avant de dire n'importe quoi on commence par se renseigner.

    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 actif
    Profil pro
    Étudiant
    Inscrit en
    Août 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 80
    Par défaut
    Je vois sur cette page
    http://msdn.microsoft.com/fr-fr/libr...3(SQL.90).aspx
    qu'on pour SQL server 2005 du moins , on peut faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ALTER TABLE table_name
     [ ALTER COLUMN column_name 
       {DROP DEFAULT 
       | SET DEFAULT constant_expression ]
       }

    sauf que manifestement, cela ne marche pas du tout

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    17:18:37,883 DEBUG [ManageDataBaseBean] alter table [table1] alter column [CHAMP_1] drop default 
    17:18:37,887 ERROR [STDERR] com.microsoft.sqlserver.jdbc.SQLServerException: Syntaxe incorrecte vers le mot clé 'default'.

    Pour info, la norme SQL92 visible à cette adresse:
    http://owen.sj.ca.us/rkowen/howto/sql92.html
    dit ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE table [ * ]
    	    MODIFY [<!COLUMN>] column { <!SET> DEFAULT value | DROP DEFAULT }
    Ce qui me permet d'affirmer que la norme n'est pas respecté

  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 986
    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 986
    Billets dans le blog
    6
    Par défaut
    Les éléments décrit dans cette page sont une erreur. La norme SQL n'implémente pas le MODIFY et à juste raison. Ceux qui ont écrit ces inepties sont des gros nuls.

    Vous pouvez acheter la norme SQL auprès de l'ISO (prix environ 300 euros).

    Cela ne m'étonne pas... Même sur Wikipedia il y a des inepties gigantesques. Exemple :
    "Les valeurs NULL"
    "Une clause à part: LIMIT ou TOP"
    dans http://fr.wikiversity.org/wiki/Struc...3%AAtes_SELECT

    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
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Août 2004
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2004
    Messages : 80
    Par défaut
    En continuant de chercher, j'ai trouvé une solution qui pourrait marcher:

    SELECT name FROM sys.default_constraints d WHERE [object_id] = OBJECT_ID(N'table.CHAMP', N'U');
    puis :
    ALTER TABLE [rowsettable] DROP CONSTRAINT name;

    Sauf que le problème est que si je fait un
    SELECT OBJECT_ID(N'table', N'U');
    il me retourne bien l'id la table, par contre pas moyen d'avoir l'id de la colonne
    SELECT OBJECT_ID(N'table.CHAMP', N'U');
    me retourne toujours null quelque soit le champ

    Savez-vous pourquoi?

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Sous SQL Server 2005, vous pouvez exécuter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT OBJECT_NAME(DC.parent_object_id) NomTable,
    		C.name NomColonne,
    		DC.name NomContrainte,
    		DC.definition Definition
    FROM sys.default_constraints DC
    JOIN sys.columns C
    	ON C.object_id = DC.parent_object_id
    	AND C.column_id = DC.parent_column_id
    WHERE  OBJECt_NAME(parent_object_id) = 'maTable'

Discussions similaires

  1. [SQL] Ajouter des lignes vides à une table : ALTER TABLE
    Par alers dans le forum SAS Base
    Réponses: 6
    Dernier message: 25/02/2014, 11h18
  2. [phpMyAdmin] Modifier une table (alter table) directement depuis phpMyAdmin
    Par floctc dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 20/04/2009, 16h11
  3. Réponses: 3
    Dernier message: 27/06/2008, 13h57
  4. Pb ALTER TABLE ADD COLUMN consécutifs
    Par Franck_Pal dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 24/07/2007, 22h54
  5. [VB6] Alter table alter column syntaxe
    Par enibris dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 13/04/2006, 17h11

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