如何使用INFORMATION_SCHEMA找到默认约束?
-
02-07-2019 - |
题
我正在尝试测试是否存在给定的默认约束。我不想使用sysobjects表,而是使用更标准的INFORMATION_SCHEMA。
之前我用它来检查表和主键约束,但我没有看到任何地方的默认约束。
他们不在吗? (我正在使用MS SQL Server 2000)。
编辑:我希望得到约束的名称。
解决方案
据我了解,默认值约束不是ISO标准的一部分,因此它们不会出现在INFORMATION_SCHEMA中。 INFORMATION_SCHEMA似乎是此类任务的最佳选择,因为它是跨平台的,但如果信息不可用,则应使用对象目录视图(sys。*)而不是SQL Server中不推荐使用的系统表视图2005年及以后。
下面与@ user186476的回答几乎相同。它返回给定列的默认值约束的名称。 (对于非SQL Server用户,您需要使用默认名称才能删除它,如果您没有自己命名默认约束,SQL Server会创建一些疯狂的名称,如“DF_TableN_Colum_95AFE4B5”。为了使其更容易将来更改您的架构,始终明确命名您的约束!)
-- 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'
其他提示
通过指定默认约束与之关联的表名称和列名称,您可以使用以下内容来进一步缩小结果范围:
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'
Information_Schema
视图中似乎没有默认约束名称。
使用 SELECT * FROM sysobjects WHERE xtype ='D'AND name = @name
按名称
下面的脚本列出了所有默认约束以及运行它的数据库中用户表的默认值:
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
如果要通过列名或表名获取约束,或者想要获取数据库中的所有约束,请查看其他答案。但是,如果你只是在寻找问题的确切问题,即“测试一个给定的默认约束是否存在......通过约束的名称”,那么就更容易了方式。
这是一个面向未来的答案,根本不使用 sysobjects
或其他 sys
表:
IF object_id('DF_CONSTRAINT_NAME', 'D') IS NOT NULL BEGIN
-- constraint exists, work with it.
END
INFORMATION_SCHEMA.COLUMNS的COLUMN_DEFAULT列是您要找的?
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
我认为它不在INFORMATION_SCHEMA中 - 您可能必须使用sysobjects或相关的弃用表/视图。
你会认为在INFORMATION_SCHEMA.TABLE_CONSTRAINTS中有一个类型,但我没有看到。
可能是因为在某些其他SQL DBMS上,“默认约束”是指“默认约束”。不是真正的约束,你不会在“INFORMATION_SCHEMA.TABLE_CONSTRAINTS”中找到它的名字,所以你最好的选择是“INFORMATION_SCHEMA.COLUMNS”。正如其他人已经提到的那样。
(SQLServer-ignoramus here)
当您必须知道“默认约束”的名称时,我能想到的唯一原因是SQLServer不支持&quot; ALTER TABLE xxx ALTER COLUMN yyy SET DEFAULT ...“
命令。但是,您已经处于非标准区域,您必须使用特定于产品的方式来获得所需的信息。
如何使用CHECK_CONSTRAINTS和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
我正在使用以下脚本来检索所有默认值(sp_bindefault)和所有默认约束以及以下脚本:
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 = ''
对象目录视图:sys.default_constraints
信息架构视图 INFORMATION_SCHEMA
符合ANSI标准,但默认约束不是ISO标准的一部分。 Microsoft SQL Server提供系统目录视图以获取有关SQL Server对象元数据的信息。
sys.default_constraints
系统目录视图,用于获取有关默认约束的信息。
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;