2009-06-03 93 views
16

Quiero encontrar las claves externas de una tabla, pero puede haber más de un usuario/esquema con una tabla con el mismo nombre. ¿Cómo puedo encontrar el que está viendo el usuario actualmente conectado? ¿Hay alguna función que le dé a su dueño? ¿Qué pasa si hay sinónimos públicos?¿Cómo puedo encontrar el PROPIETARIO de un objeto en Oracle?

Respuesta

30

Puede consultar los ALL_OBJECTS Vista:

select owner 
    , object_name 
    , object_type 
    from ALL_OBJECTS 
where object_name = 'FOO' 

para encontrar sinónimos:

select * 
    from ALL_SYNONYMS 
where synonym_name = 'FOO' 

Solo para aclarar, si instrucción SQL una usuario del usuario hace referencia a un nombre de objeto sin cualificación esquema (por ejemplo, 'FOO'), Oracle FIRST verifica el esquema del usuario para un objeto de ese nombre (incluidos los sinónimos en el esquema de ese usuario). Si Oracle no puede resolver la referencia desde el esquema del usuario, Oracle busca un sinónimo público.

Si usted está buscando específicamente para las restricciones en un nombre_tabla en particular:

select c.* 
    from all_constraints c 
where c.table_name = 'FOO' 
union all 
select cs.* 
    from all_constraints cs 
    join all_synonyms s 
    on (s.table_name = cs.table_name 
    and s.table_owner = cs.owner 
    and s.synonym_name = 'FOO' 
     ) 

HTH

- Adición:

Si el usuario se le concede acceso a los puntos de vista DBA_ (por ejemplo, si su al usuario se le ha otorgado SELECT_CATALOG_ROLE), puede sustituir 'DBA_' en lugar de 'ALL_' en los ejemplos anteriores de SQL. Las vistas ALL_x solo muestran objetos a los que se le han otorgado privilegios. Las vistas DBA_x mostrarán todos los objetos de la base de datos, tanto si tiene privilegios como si no.

+0

sólo para hacer la consulta un poco más flexible, me gustaría consultar 'donde más baja (object_name) = ' foo'' Esto es especialmente útil cuando tiene un nombre de función, pero no de mayúsculas y minúsculas (por ejemplo, como una llamada en un programa externo que no distingue entre mayúsculas y minúsculas, como fue el caso para mí). – Travis

+0

@Travis: eso haría que la consulta sea más flexible. Para que coincida más de cerca con la forma en que Oracle ve los identificadores "insensibles a mayúsculas y minúsculas" en una declaración de SQL, queremos ** ** WHERE object_name = UPPER ('foo') '**. (Un identificador que no está entre comillas dobles en una declaración de SQL es visto por Oracle como si fuera mayúscula. (Los identificadores de Oracle * son * sensibles a mayúsculas y minúsculas, solo debemos incluirlos entre comillas dobles en una declaración de SQL para preservar las minúsculas) Cuando hacemos 'SELECT * FROM foo', Oracle realmente ve el identificador como' FOO', como si hubiéramos hecho 'SELECT * FROM FOO'.) – spencer7593

2

pregunta interesante - No creo que haya ninguna función de Oracle que hace esto (casi como un comando "que" en Unix), pero se puede conseguir la orden de resolución para el nombre de:

select * from 
(
select object_name objname, object_type, 'my object' details, 1 resolveOrder 
    from user_objects 
    where object_type not like 'SYNONYM' 
union all 
select synonym_name obj , 'my synonym', table_owner||'.'||table_name, 2 resolveOrder 
    from user_synonyms 
union all 
select synonym_name obj , 'public synonym', table_owner||'.'||table_name, 3 resolveOrder 
    from all_synonyms where owner = 'PUBLIC' 
) 
where objname like upper('&objOfInterest') 
1

Para buscar el nombre del usuario actual dentro de una sesión de Oracle, use la función USER.

Tenga en cuenta que el propietario de la restricción, el propietario de la tabla que contiene la clave externa y el propietario de la tabla a la que se hace referencia pueden ser todos diferentes. Suena como que ’ es la mesa propietario le ’ re interesado, en cuyo caso debe estar cerca de lo que quiere:

select Constraint_Name 
from All_Constraints 
where Table_Name = 'WHICHEVER_TABLE' 
    and Constraint_Type = 'R' and Owner = User; 
1

vistas de Oracle como ALL_TABLES y ALL_CONSTRAINTS tienen una columna de propietario, el cual se puede utilizar para restringe tu consulta. También hay variantes de estas tablas que comienzan con USER en lugar de ALL, que solo enumeran objetos a los que puede acceder el usuario actual.

Una de these vistas debería ayudar a resolver su problema. Siempre me funcionaron bien para problemas similares.

0

Encontré esta pregunta como el resultado principal al buscar en Google cómo encontrar el propietario de una tabla en Oracle, así que pensé que aportaría una tabla de respuesta específica para la conveniencia de los demás.

encontrar al propietario de una tabla específica en una base de datos Oracle, utilice la siguiente consulta:

select owner from ALL_TABLES where TABLE_NAME ='<MY-TABLE-NAME>'; 
Cuestiones relacionadas