ver unico unicas una tipos tabla restricciones restriccion llaves constraint check sql sql-server sql-server-2008 constraints

unico - SQL Server 2008- Obtener restricciones de tabla



unique sql server (5)

¿Podría ayudarme a enmarcar una consulta que recupere las restricciones en todas las tablas, el recuento de restricciones en cada tabla y también mostrar NULL para las tablas que NO tienen ninguna restricción? Thx por adelantado!

Esto es lo que tengo hasta ahora:

Select SysObjects.[Name] As [Constraint Name] , Tab.[Name] as [Table Name], Col.[Name] As [Column Name] From SysObjects Inner Join (Select [Name],[ID] From SysObjects) As Tab On Tab.[ID] = Sysobjects.[Parent_Obj] Inner Join sysconstraints On sysconstraints.Constid = Sysobjects.[ID] Inner Join SysColumns Col On Col.[ColID] = sysconstraints.[ColID] And Col.[ID] = Tab.[ID] order by [Tab].[Name]


Debe usar las vistas del catálogo del sistema actual (si está en SQL Server 2005 o posterior, las vistas de sysobjects están en desuso y deben evitarse), consulte la extensa documentación de Libros en pantalla de MSDN SQL Server en las vistas de catálogo aquí .

Hay bastantes puntos de vista que pueden interesarle:

  • sys.default_constraints para las restricciones predeterminadas en las columnas
  • sys.check_constraints para verificar las restricciones en las columnas
  • sys.key_constraints para restricciones de clave (por ejemplo, claves principales)
  • sys.foreign_keys para relaciones de clave foránea

y mucho más - ¡compruébalo!

Puede consultar y unirse a esas vistas para obtener la información necesaria; por ejemplo, enumerará las tablas, columnas y todas las restricciones predeterminadas definidas en ellas:

SELECT TableName = t.Name, ColumnName = c.Name, dc.Name, dc.definition FROM sys.tables t INNER JOIN sys.default_constraints dc ON t.object_id = dc.parent_object_id INNER JOIN sys.columns c ON dc.parent_object_id = c.object_id AND c.column_id = dc.parent_column_id ORDER BY t.Name


Puede obtener esta consulta

Restricción única,

Restricción predeterminada con valor,

Clave externa con tabla y columna referenciadas

Y Restricción de clave primaria.

Select C.*, (Select definition From sys.default_constraints Where object_id = C.object_id) As dk_definition, (Select definition From sys.check_constraints Where object_id = C.object_id) As ck_definition, (Select name From sys.objects Where object_id = D.referenced_object_id) As fk_table, (Select name From sys.columns Where column_id = D.parent_column_id And object_id = D.parent_object_id) As fk_col From sys.objects As C Left Join (Select * From sys.foreign_key_columns) As D On D.constraint_object_id = C.object_id Where C.parent_object_id = (Select object_id From sys.objects Where type = ''U'' And name = ''Table Name Here'');


Traté de editar la answer proporcionada por pero no fue aceptada por alguna razón. Formatea el sql para facilitar la lectura, incluye el esquema y también nombra el nombre predeterminado para que pueda pegarse fácilmente en otro código.

SELECT SchemaName = s.Name, TableName = t.Name, ColumnName = c.Name, DefaultName = dc.Name, DefaultDefinition = dc.Definition FROM sys.schemas s JOIN sys.tables t on t.schema_id = s.schema_id JOIN sys.default_constraints dc on dc.parent_object_id = t.object_id JOIN sys.columns c on c.object_id = dc.parent_object_id and c.column_id = dc.parent_column_id ORDER BY s.Name, t.Name, c.name


Utilicé la siguiente consulta para recuperar la información de las restricciones en SQL Server 2012, y funciona perfectamente. Espero que te sea útil.

SELECT tab.name AS [Table] ,tab.id AS [Table Id] ,constr.name AS [Constraint Name] ,constr.xtype AS [Constraint Type] ,CASE constr.xtype WHEN ''PK'' THEN ''Primary Key'' WHEN ''UQ'' THEN ''Unique'' ELSE '''' END AS [Constraint Name] ,i.index_id AS [Index ID] ,ic.column_id AS [Column ID] ,clmns.name AS [Column Name] ,clmns.max_length AS [Column Max Length] ,clmns.precision AS [Column Precision] ,CASE WHEN clmns.is_nullable = 0 THEN ''NO'' ELSE ''YES'' END AS [Column Nullable] ,CASE WHEN clmns.is_identity = 0 THEN ''NO'' ELSE ''YES'' END AS [Column IS IDENTITY] FROM SysObjects AS tab INNER JOIN SysObjects AS constr ON(constr.parent_obj = tab.id AND constr.type = ''K'') INNER JOIN sys.indexes AS i ON( (i.index_id > 0 and i.is_hypothetical = 0) AND (i.object_id=tab.id) AND i.name = constr.name ) INNER JOIN sys.index_columns AS ic ON (ic.column_id > 0 and (ic.key_ordinal > 0 or ic.partition_ordinal = 0 or ic.is_included_column != 0)) AND (ic.index_id=CAST(i.index_id AS int) AND ic.object_id=i.object_id) INNER JOIN sys.columns AS clmns ON clmns.object_id = ic.object_id and clmns.column_id = ic.column_id WHERE tab.xtype = ''U'' ORDER BY tab.name


SELECT [oj].[name] [TableName], [ac].[name] [ColumnName], [dc].[name] [DefaultConstraintName], [dc].[definition] FROM sys.default_constraints [dc], sys.all_objects [oj], sys.all_columns [ac] WHERE ( ([oj].[type] IN (''u'')) AND ([oj].[object_id] = [dc].[parent_object_id]) AND ([oj].[object_id] = [ac].[object_id]) AND ([dc].[parent_column_id] = [ac].[column_id]) )