2010-03-02 301 views
6

Teniendo una secuencia, necesito averiguar qué table.column obtiene sus valores. Por lo que sé, Oracle no hace un seguimiento de esta relación. Entonces, buscar la secuencia en el código fuente sería la única manera. ¿Está bien?¿Qué tabla de Oracle utiliza una secuencia?

¿Alguien sabe de alguna forma de averiguar esta relación de tabla de secuencia?

+1

Oracle no lo rastrea porque no existe tal relación, excepto por convención. Es por eso que usualmente usas algún tipo de convención de nombres, p. la tabla XYZ tiene la secuencia SEQ_XYZ. –

Respuesta

2

En la base de datos se puede buscar todo el código almacenado en el esquema de la siguiente manera:

select type, name, line, text 
from all_source 
where owner = 'MYSCHEMA' 
and upper(text) like '%MYSEQ.NEXTVAL%'; 

En SQL Developer, hay un informe para hacer esto.

+0

Esto no resolverá casos como "SELECCIONE MYSEQ. NEXTVAL FROM dual"; – jva

+0

Es cierto, y eso siempre es un problema con las búsquedas de texto. Podría usar '% MYSEQ%.% NEXTVAL%', pero eso podría producir falsos positivos para algo como 'MYSEQ2.NEXTVAL'. ¡No hay respuestas fáciles para eso! –

2

Si su secuencia se utiliza en un desencadenador, el desencadenador se enumerará en la lista "referenciada por" de la secuencia.

Si su secuencia solo se usa en las consultas de código fuente, entonces sí, explorar el código es la única manera.

+0

Si el procedimiento almacenado 'sp_something' hace referencia a la secuencia' seq_something', entonces 'sp_something' seguramente aparecerá en la lista' seq_something' de "referenciado por" – mcrisc

+0

@ Jaú: sí, lo hará. – Quassnoi

1

Uso GREP para escanear toda su fuente de "myseq.NextVal" - myseq ser el que usted está buscando ....

+0

Ese ha sido mi enfoque. 'grep -Prine" myseq \ " .' en toda la base de código. El problema es que las personas no tienen todo el código bajo control de versión. Creo que hay muchos códigos (procedimientos) almacenados solo en la base de datos. – mcrisc

+0

Si solo puede referirse al código almacenado en DB, intente con 'ALL_SOURCE'. Si está en 10g, use la función 'REGEXP_LIKE' para buscar. – Guru

+0

@Guru es 9i. Pero de todos modos, es bueno saber sobre 'REGEX_LIKE'. Gracias. – mcrisc

7

El problema es que Oracle nos permite usar una secuencia para llenar columnas en varias tablas. Los escenarios donde esto podría ser deseable incluyen implementaciones de super-tipo/sub-tipo.

Puede usar las dependencias en el diccionario de datos para identificar las relaciones. Por ejemplo, si se utiliza disparadores para asignar los valores a continuación, esta consulta le ayudará a:

select ut.table_name 
     , ud.referenced_name as sequence_name 
from user_dependencies ud 
     join user_triggers ut on (ut.trigger_name = ud.name) 
where ud.type='TRIGGER' 
and ud.referenced_type='SEQUENCE' 
/

Si utiliza PL/SQL a continuación, se puede escribir algo similar para TYPE in ('PACKAGE BODY', 'PROCEDURE', 'FUNCTION'), aunque todavía se requieren algún pesca de arrastre a través de la fuente código para asignar tablas y secuencias cuando tiene múltiples visitas.

+0

Si tiene sequence_name y desea verificar para qué tablas se está utilizando mediante triggers, puede usar la consulta anterior con una condición más "y" especificando el nombre de la secuencia: seleccionar ut.table_name , ud.referenced_name como sequence_name from user_dependencies ud join user_triggers ut on (ut.trigger_name = ud.name) donde ud.type = 'TRIGGER' y ud.referenced_type = 'SEQUENCE' y ud.referenced_name = 'YOUR_SEQ_NAME'; – nanosoft

0

Me gustaría agregar background información sobre las secuencias.

Cuestiones relacionadas