如何使用INFORMATION_SCHEMA查找默认约束?

时间:2020-03-06 14:48:21  来源:igfitidea点击:

我正在尝试测试是否存在给定的默认约束。我不想使用sysobjects表,而是使用更标准的INFORMATION_SCHEMA。

我以前曾用它来检查表和主键约束,但是在任何地方都看不到默认约束。

他们不在吗? (我正在使用MS SQL Server 2000)。

编辑:我正在寻找通过约束的名称。

解决方案

我们正在寻找INFORMATION_SCHEMA.COLUMNS的COLUMN_DEFAULT列吗?

我认为它可能不在INFORMATION_SCHEMA中,我们可能不必使用sysobjects或者相关的不推荐使用的表/视图。

我们可能会在INFORMATION_SCHEMA.TABLE_CONSTRAINTS中找到一种类型,但是我没有看到。

可能是因为在其他一些SQL DBMS上,"默认约束"并不是真正的约束,因此我们不会在" INFORMATION_SCHEMA.TABLE_CONSTRAINTS"中找到其名称,因此最好的选择是" INFORMATION_SCHEMA.COLUMNS",正如其他人已经提到的那样。

(SQLServer-ignoramus在这里)

当我们必须知道"默认约束"的名称时,我想到的唯一原因是SQLServer不支持" ALTER TABLE xxx ALTER COLUMN yyy SET DEFAULT ..."命令。但是,那时我们已经处在非标准区域,则必须使用特定于产品的方式来获得所需的东西。

" Information_Schema"视图中似乎没有默认约束名称。

使用SELECT * FROM sysobjects WHERE xtype ='D'AND name = @ name
通过名称查找默认约束

我们可以通过指定默认约束与之相关的表名和列名,使用以下内容进一步缩小结果范围:

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'

如何结合使用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

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