sql >> Base de Datos >  >> RDS >> Sqlserver

Devolver todas las claves foráneas y VERIFICAR las restricciones en una base de datos de SQL Server (ejemplos de T-SQL)

En SQL Server, puede usar Transact-SQL para devolver una lista de todas las claves externas y CHECK restricciones para la base de datos actual.

Los ejemplos de esta página consultan dos vistas del sistema para recuperar esta información: sys.foreign_keys y sys.check_constraints . Puede consultar cada uno por separado o usar UNION para mostrarlos todos en un único conjunto de resultados.

Ejemplo 1:conjunto de resultados combinados

En este ejemplo, uso UNION para devolver claves foráneas y CHECK restricciones en el mismo conjunto de resultados.

SELECT
  OBJECT_NAME(parent_object_id) AS 'Table',
  name AS 'Constraint',
  type_desc,
  is_disabled, 
  is_not_trusted
FROM sys.foreign_keys
UNION
SELECT 
  OBJECT_NAME(parent_object_id),
  name,
  type_desc,
  is_disabled, 
  is_not_trusted
FROM sys.check_constraints;

Resultado:

+------------------+--------------------------------+------------------------+---------------+------------------+
| Table            | Constraint                     | type_desc              | is_disabled   | is_not_trusted   |
|------------------+--------------------------------+------------------------+---------------+------------------|
| BandMember       | FK_BandMember_Band             | FOREIGN_KEY_CONSTRAINT | 0             | 0                |
| BandMember       | FK_BandMember_Musician         | FOREIGN_KEY_CONSTRAINT | 0             | 0                |
| City             | FK_City_Country                | FOREIGN_KEY_CONSTRAINT | 0             | 0                |
| MembershipPeriod | chkValidEndDate                | CHECK_CONSTRAINT       | 0             | 0                |
| MembershipPeriod | FK_MembershipPeriod_BandMember | FOREIGN_KEY_CONSTRAINT | 0             | 0                |
+------------------+--------------------------------+------------------------+---------------+------------------+

En este caso, la base de datos actual contiene cuatro claves foráneas y una CHECK restricción.

También podemos ver si cada restricción está habilitada o deshabilitada, así como si es confiable o no.

Ejemplo 2:devolver todas las columnas

Estas dos vistas devuelven más columnas de las que he enumerado en este ejemplo. Siempre puede usar un comodín para devolver todas las columnas. Sin embargo, si hace esto, no podrá usar UNION , porque cada vista devuelve un número diferente de columnas.

Por lo tanto, deberá consultarlos por separado. Por ejemplo:

SELECT * FROM sys.foreign_keys;
SELECT * FROM sys.check_constraints;

Eso producirá dos conjuntos de resultados:uno que contiene las claves foráneas, el otro que contiene el CHECK restricciones.

Para ahorrar espacio, no mostraré los resultados de esa consulta. Pero esto es lo que produce la segunda línea (utilizando la salida vertical para evitar tener que desplazarse horizontalmente):

SELECT * FROM sys.check_constraints;

Resultado (usando salida vertical):

-[ RECORD 1 ]-------------------------
name                    | chkValidEndDate
object_id               | 1525580473
principal_id            | NULL
schema_id               | 1
parent_object_id        | 1349579846
type                    | C 
type_desc               | CHECK_CONSTRAINT
create_date             | 2019-09-11 00:33:02.587
modify_date             | 2019-09-11 00:33:02.587
is_ms_shipped           | 0
is_published            | 0
is_schema_published     | 0
is_disabled             | 0
is_not_for_replication  | 0
is_not_trusted          | 0
parent_column_id        | 0
definition              | ([EndDate]>=[StartDate])
uses_database_collation | 1
is_system_named         | 0

Puede incluir cualquiera de estas columnas en su consulta, pero si las combina con las claves foráneas, asegúrese de incluir las mismas columnas en ambas vistas.

El sys.foreign_keys view devuelve algunas columnas más. Aquí hay una consulta modificada, donde devuelvo la primera fila (por nombre) de esa vista.

SELECT TOP(1) * 
FROM sys.foreign_keys
ORDER BY name;

Resultado (usando salida vertical):

-[ RECORD 1 ]-------------------------
name                           | FK_BandMember_Band
object_id                      | 1317579732
principal_id                   | NULL
schema_id                      | 1
parent_object_id               | 1285579618
type                           | F 
type_desc                      | FOREIGN_KEY_CONSTRAINT
create_date                    | 2019-08-17 15:58:42.027
modify_date                    | 2019-08-17 15:58:42.027
is_ms_shipped                  | 0
is_published                   | 0
is_schema_published            | 0
referenced_object_id           | 1253579504
key_index_id                   | 1
is_disabled                    | 0
is_not_for_replication         | 0
is_not_trusted                 | 0
delete_referential_action      | 0
delete_referential_action_desc | NO_ACTION
update_referential_action      | 0
update_referential_action_desc | NO_ACTION
is_system_named                | 0