Oracle encuentra una restricción

166

Tengo una restricción llamada users.SYS_C00381400. ¿Cómo encuentro cuál es esa restricción? ¿Hay alguna manera de consultar todas las restricciones?

David Oneill
fuente
¿Cómo saber la restricción? users.SYS_C00381400
Vinay
El nombre de la restricción apareció en un mensaje de error.
David Oneill

Respuestas:

268
select * from all_constraints
where owner = '<NAME>'
and constraint_name = 'SYS_C00381400'
/

Al igual que todas las vistas de diccionario de datos, esta es una vista USER_CONSTRAINTS si solo desea verificar su esquema actual y una vista DBA_CONSTRAINTS para usuarios de administración.

La construcción del nombre de restricción indica un nombre de restricción generado por el sistema. Por ejemplo, si especificamos NOT NULL en una declaración de tabla. O, de hecho, una clave primaria o única. Por ejemplo:

SQL> create table t23 (id number not null primary key)
  2  /

Table created.

SQL> select constraint_name, constraint_type
  2  from user_constraints
  3  where table_name = 'T23'
  4  /

CONSTRAINT_NAME                C
------------------------------ -
SYS_C00935190                  C
SYS_C00935191                  P

SQL>

'C'para cheque, 'P'para primaria.

En general, es una buena idea dar a las restricciones relacionales un nombre explícito. Por ejemplo, si la base de datos crea un índice para la clave primaria (lo que hará si esa columna aún no está indexada), usará el nombre de restricción o nombre del índice. No desea una base de datos llena de índices nombrados como SYS_C00935191.

Para ser sincero, la mayoría de las personas no se molestan en nombrar restricciones NO NULAS.

APC
fuente
25

Para obtener una descripción más detallada (qué tabla / columna hace referencia a qué tabla / columna) puede ejecutar la siguiente consulta:

SELECT   uc.constraint_name||CHR(10)
   ||      '('||ucc1.TABLE_NAME||'.'||ucc1.column_name||')' constraint_source
   ,       'REFERENCES'||CHR(10)
   ||      '('||ucc2.TABLE_NAME||'.'||ucc2.column_name||')' references_column
FROM user_constraints uc ,
  user_cons_columns ucc1 ,
  user_cons_columns ucc2
WHERE uc.constraint_name = ucc1.constraint_name
AND uc.r_constraint_name = ucc2.constraint_name
AND ucc1.POSITION        = ucc2.POSITION -- Correction for multiple column primary keys.
AND uc.constraint_type   = 'R'
AND uc.constraint_name   = 'SYS_C00381400'
ORDER BY ucc1.TABLE_NAME ,
  uc.constraint_name;

A partir de aquí .

Thiago
fuente
6

tal vez esto pueda ayudar ...

SELECT constraint_name, constraint_type, column_name
from user_constraints natural join user_cons_columns
where table_name = "my_table_name";
van Gogh
fuente