如何在Azure SQL托管实例中查找显式命名的NOT NULL约束?
查找Azure SQL托管实例中的显式命名NOT NULL约束
在Azure SQL托管实例(以及SQL Server体系)中,显式命名的NOT NULL约束确实归属于CHECK约束范畴,但直接查询sys.objects的CHECK_CONSTRAINT类型可能因缺少精准过滤或关联而无法定位目标约束。以下是两种有效的查询方案:
方法一:通过sys.check_constraints视图查询
该视图专门存储CHECK约束(含显式NOT NULL约束)的详细信息,关联表和列信息后可精准定位目标约束:
SELECT cc.name AS constraint_name, t.name AS table_name, c.name AS column_name, cc.definition FROM my_db.sys.check_constraints cc JOIN my_db.sys.tables t ON cc.parent_object_id = t.object_id JOIN my_db.sys.columns c ON cc.parent_object_id = c.object_id AND cc.parent_column_id = c.column_id WHERE cc.name = 'nn_my_table_my_column';
方法二:关联sys.objects与表、列信息查询
显式NOT NULL约束在sys.objects中的类型标识为C(对应type_desc为CHECK_CONSTRAINT),通过关联表和列信息可筛选出目标约束:
SELECT o.name AS constraint_name, t.name AS table_name, c.name AS column_name FROM my_db.sys.objects o JOIN my_db.sys.tables t ON o.parent_object_id = t.object_id JOIN my_db.sys.columns c ON o.parent_object_id = c.object_id AND o.parent_column_id = c.column_id WHERE o.type = 'C' AND o.name = 'nn_my_table_my_column';
补充说明
此前查询sys.objects未返回结果,大概率是因为未添加约束名称过滤或关联表信息,导致目标约束被其他CHECK约束淹没,或是未指定正确的数据库前缀。执行上述带精准过滤的查询即可定位目标NOT NULL约束。
内容的提问来源于stack exchange,提问作者skyline01
相关产品推荐
相关产品推荐

