Comment trouver une contrainte par défaut en utilisant le schéma D'INFORMATION?
j'essaie de tester si une contrainte par défaut existe. Je ne veux pas utiliser la table sysobjects, mais L'information plus standard_schema.
j'ai utilisé ceci pour vérifier les tables et les principales contraintes avant, mais je ne vois aucune contrainte par défaut nulle part.
ne Sont-ils pas là? (Je suis à l'aide de MS SQL Server 2000).
EDIT: je suis à la recherche pour obtenir par le nom de la contrainte.
13 réponses
si je comprends bien, les contraintes de valeur par défaut ne font pas partie de la norme ISO, donc elles n'apparaissent pas dans INFORMATION_SCHEMA. INFORMATION_SCHEMA semble être le meilleur choix pour ce genre de tâche parce qu'il est multiplate-forme, mais si l'information n'est pas disponible, il faut utiliser les vues de catalogue d'objets (sys.* ) au lieu des vues de table système, qui sont dépréciées dans SQL Server 2005 et plus tard.
ci-dessous est à peu près le même que la réponse de @user186476. Il retourne le nom de la contrainte de valeur par défaut pour une colonne donnée. (Pour les utilisateurs non-SQL Server, vous avez besoin du nom par défaut pour le laisser tomber, 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'
vous pouvez utiliser ce qui suit pour affiner encore les résultats en spécifiant le nom de la Table et le nom de la colonne auxquels la contrainte par défaut correspond:
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'
il ne semble pas y avoir de noms de contraintes par défaut dans les vues Information_Schema
.
utiliser SELECT * FROM sysobjects WHERE xtype = 'D' AND name = @name
pour trouver une contrainte par défaut par nom
le script ci-dessous liste Toutes les contraintes par défaut et les valeurs par défaut pour les tables d'utilisateurs dans 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
select c.name, col.name from sys.default_constraints c
inner join sys.columns col on col.default_object_id = c.object_id
inner join sys.objects o on o.object_id = c.parent_object_id
inner join sys.schemas s on s.schema_id = o.schema_id
where s.name = @SchemaName and o.name = @TableName and col.name = @ColumnName
si vous voulez obtenir une contrainte par les noms de colonne ou de table, ou si vous voulez obtenir toutes les contraintes dans la base de données, consultez d'autres réponses. Cependant, si vous cherchez exactement ce que la question demande, à savoir, à "test si une contrainte par défaut existe ... par le nom de la contrainte" , alors il y a un moyen beaucoup plus facile.
Voici une réponse à l'épreuve du futur qui n'utilise pas les tableaux sysobjects
ou autres sys
à tous:
IF object_id('DF_CONSTRAINT_NAME', 'D') IS NOT NULL BEGIN
-- constraint exists, work with it.
END
est la colonne colonne de Default D'INFORMATION_SCHEMA.Les COLONNES de ce que vous recherchez?
WHILE EXISTS(
SELECT * FROM sys.all_columns
INNER JOIN sys.tables ST ON all_columns.object_id = ST.object_id
INNER JOIN sys.schemas ON ST.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 ST.name = 'MyTable'
)
BEGIN
DECLARE @SQL NVARCHAR(MAX) = N'';
SET @SQL = ( SELECT TOP 1
'ALTER TABLE ['+ schemas.name + '].[' + ST.name + '] DROP CONSTRAINT ' + default_constraints.name + ';'
FROM
sys.all_columns
INNER JOIN
sys.tables ST
ON all_columns.object_id = ST.object_id
INNER JOIN
sys.schemas
ON ST.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 ST.name = 'MyTable'
)
PRINT @SQL
EXECUTE sp_executesql @SQL
--End if Error
IF @@ERROR <> 0
BREAK
END
Je ne pense pas que ce soit dans L'INFORMATION_SCHEMA - vous devrez probablement utiliser sysobjects ou tableaux/vues connexes dépréciés.
vous pourriez penser qu'il y aurait un type pour cela dans INFORMATION_SCHEMA.TABLEAU_CONSTRAINTS, but I don't see one.
probablement parce que sur certains autres DBMSs SQL la" contrainte par défaut "n'est pas vraiment une contrainte, vous ne trouverez pas son nom dans" INFORMATION_SCHEMA.TABLE_CONSTRAINTS", de sorte que votre meilleur pari est "INFORMATION_SCHEMA.Les COLONNES" comme d'autres l'ont déjà mentionné.
(SQLServer-ignoramus ici)
la seule raison à laquelle je peux penser lorsque vous devez connaître le nom de la"contrainte par défaut "est si SQLServer ne supporte pas la commande "ALTER TABLE xxx ALTER COLUMN yyy SET DEFAULT..."
. Mais alors vous êtes déjà dans une zone non standard et vous devez utiliser les moyens spécifiques au produit pour obtenir ce dont vous avez besoin.
Que Diriez-vous d'utiliser une combinaison de CHECK_CONSTRAINTS et de CONSTRAINT_COLUMN_USAGE:
select columns.table_name,columns.column_name,columns.column_default,checks.constraint_name
from information_schema.columns columns
inner join information_schema.constraint_column_usage usage on
columns.column_name = usage.column_name and columns.table_name = usage.table_name
inner join information_schema.check_constraints checks on usage.constraint_name = checks.constraint_name
where columns.column_default is not null
j'utilise le script suivant pour récupérer toutes les valeurs par défaut (sp_binddefaults) et toutes les contraintes par défaut avec les scripts suivants:
SELECT
t.name AS TableName, c.name AS ColumnName, SC.COLUMN_DEFAULT AS DefaultValue, dc.name AS DefaultConstraintName
FROM
sys.all_columns c
JOIN sys.tables t ON c.object_id = t.object_id
JOIN sys.schemas s ON t.schema_id = s.schema_id
LEFT JOIN sys.default_constraints dc ON c.default_object_id = dc.object_id
LEFT JOIN INFORMATION_SCHEMA.COLUMNS SC ON (SC.TABLE_NAME = t.name AND SC.COLUMN_NAME = c.name)
WHERE
SC.COLUMN_DEFAULT IS NOT NULL
--WHERE t.name = '' and c.name = ''
de l'Objet d'Affichage Catalogue : sys.default_constraints
les vues de schéma d'information INFORMATION_SCHEMA
sont conformes à la norme ANSI, mais les contraintes par défaut ne font pas partie de la norme ISO. Microsoft SQL Server fournit des vues de catalogue système pour obtenir des informations sur les métadonnées D'objet SQL Server.
sys.default_constraints
vue catalogue système utilisée pour obtenir les informations sur les contraintes par défaut.
SELECT so.object_id TableName,
ss.name AS TableSchema,
cc.name AS Name,
cc.object_id AS ObjectID,
sc.name AS ColumnName,
cc.parent_column_id AS ColumnID,
cc.definition AS Defination,
CONVERT(BIT,
CASE cc.is_system_named
WHEN 1
THEN 1
ELSE 0
END) AS IsSystemNamed,
cc.create_date AS CreationDate,
cc.modify_date AS LastModifiednDate
FROM sys.default_constraints cc WITH (NOLOCK)
INNER JOIN sys.objects so WITH (NOLOCK) ON so.object_id = cc.parent_object_id
LEFT JOIN sys.schemas ss WITH (NOLOCK) ON ss.schema_id = so.schema_id
LEFT JOIN sys.columns sc WITH (NOLOCK) ON sc.column_id = cc.parent_column_id
AND sc.object_id = cc.parent_object_id
ORDER BY so.name,
cc.name;