130 votes

Comment trouver une contrainte par défaut en utilisant INFORMATION_SCHEMA ?

J'essaie de tester si une contrainte par défaut donnée existe. Je ne veux pas utiliser la table sysobjects, mais la table plus standard INFORMATION_SCHEMA.

J'ai déjà utilisé cette méthode pour vérifier les tables et les contraintes de clé primaire, mais je ne vois nulle part de contraintes par défaut.

Ne sont-elles pas là ? (J'utilise MS SQL Server 2000).

EDIT : Je cherche à obtenir le nom de la contrainte.

137voto

Robert Calhoun Points 1395

Si je comprends bien, les contraintes de valeur par défaut ne font pas partie de la norme ISO et n'apparaissent donc pas dans INFORMATION_SCHEMA. INFORMATION_SCHEMA semble être le meilleur choix pour ce type de tâche car il est multiplateforme, mais si l'information n'est pas disponible, il faut utiliser les vues du catalogue d'objets (sys.*) au lieu des vues de la table système, qui sont dépréciées dans SQL Server 2005 et plus.

La réponse ci-dessous est à peu près la même que celle de @user186476. Elle renvoie le nom de la contrainte de valeur par défaut pour une colonne donnée. (Pour les non-utilisateurs de SQL Server, vous avez besoin du nom de la contrainte par défaut afin de la supprimer, et si vous ne nommez pas vous-même la contrainte par défaut, SQL Server crée un nom fou comme "DF_TableN_Colum_95AFE4B5". Pour faciliter la modification de votre schéma à l'avenir, nommez toujours explicitement vos contraintes).

-- returns name of a column's default value constraint 
SELECT
    default_constraints.name
FROM 
    sys.all_columns

        INNER JOIN
    sys.tables
        ON all_columns.object_id = tables.object_id

        INNER JOIN 
    sys.schemas
        ON tables.schema_id = schemas.schema_id

        INNER JOIN
    sys.default_constraints
        ON all_columns.default_object_id = default_constraints.object_id

WHERE 
        schemas.name = 'dbo'
    AND tables.name = 'tablename'
    AND all_columns.name = 'columnname'

1 votes

Remarque : il est possible d'avoir le même nom de table dans différents schémas, vous devez donc également effectuer une jointure sur la table sys.schemas.

1 votes

@DanielJamesBryars sys.schemas maintenant ajouté à la requête.

0 votes

Veuillez consulter ma réponse qui est courte et douce, fonctionne dans toutes les versions de SQL Server, ne fait aucune sys et est facile à mémoriser.

47voto

Tim Lentine Points 4039

Vous pouvez utiliser les éléments suivants pour restreindre encore plus les résultats en spécifiant le nom de la table et le nom de la colonne auxquels la contrainte par défaut est corrélée :

select * from sysobjects o 
inner join syscolumns c
on o.id = c.cdefault
inner join sysobjects t
on c.id = t.id
where o.xtype = 'D'
and c.name = 'Column_Name'
and t.name = 'Table_Name'

1 votes

Je cherche cette simple question depuis quelques heures. Merci beaucoup !

0 votes

Il devrait y avoir o.xype = 'D' pour travailler dans une base de données sensible à la casse.

41voto

devio Points 22981

Il semble qu'il n'y ait pas de noms de contraintes par défaut dans le fichier Information_Schema vues.

utiliser SELECT * FROM sysobjects WHERE xtype = 'D' AND name = @name pour trouver une contrainte par défaut par son nom

0 votes

Juste ce dont j'avais besoin. Merci

0 votes

Répond directement à la question mieux que les alternatives ultérieures (SQL 2000 & requête par nom de contrainte).

2 votes

Cela ne fonctionne que si vous connaissez le nom de la contrainte, mais si le système est assigné.....

14voto

Johan Badenhorst Points 146

Le script ci-dessous liste toutes les contraintes par défaut et les valeurs par défaut des tables utilisateurs de la base de données dans laquelle il est exécuté :

SELECT  
        b.name AS TABLE_NAME,
        d.name AS COLUMN_NAME,
        a.name AS CONSTRAINT_NAME,
        c.text AS DEFAULT_VALUE
FROM sys.sysobjects a INNER JOIN
        (SELECT name, id
         FROM sys.sysobjects 
         WHERE xtype = 'U') b on (a.parent_obj = b.id)
                      INNER JOIN sys.syscomments c ON (a.id = c.id)
                      INNER JOIN sys.syscolumns d ON (d.cdefault = a.id)                                          
 WHERE a.xtype = 'D'        
 ORDER BY b.name, a.name

2voto

user12861 Points 1094

La colonne COLUMN_DEFAULT de INFORMATION_SCHEMA.COLUMNS correspond-elle à ce que vous recherchez ?

0 votes

Oui et non, il me dit qu'il y a un défaut et ce qu'il est, mais j'ai besoin du nom de la contrainte aussi.

1 votes

Sachez également que si votre login SQL d'exécution ne possède pas le schéma dbo, vous risquez de ne trouver que des valeurs NULL dans la colonne COLUMN_DEFAULT.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X