Descobrir sequence de uma tabela.

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Moloukos
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 54
Registrado em: Qui, 18 Set 2008 10:22 pm
Localização: São Paulo - SP
Moloukos Rox

Boa noite.

As vezes me deparo com uma situação onde preciso descobrir a sequence de uma tabela. Porém como o banco de dados é antigo, foi criado sem critérios. Algumas sequences não estão nem parecidas com o nome da tabela que as utilizam, então precisamos procurar na aplicação ou nas packages do banco onde são utilizadas.

Sei que temos as opções abaixo para encontrar no banco de dados, porém volta no problema do nome não ser nada parecido com a tabela.

Selecionar tudo

select * from all_objects where object_type = 'SEQUENCE'
select * from all_sequences
select * from user_sequences
A dúvida: Existe uma maneira mais fácil ou uma query onde indicamos a tabela e é mostrada a sua sequence???
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother, bom dia.
beleza?

Fiz um teste aqui, porém, partindo do princípio que você saiba o nome da sequence e, sua procura seja no dicionário de dados (não em um front end com o Forms, Java etc).

Selecionar tudo


CREATE TABLE TESTE_TREVISOLLI (COD NUMBER
                              ,DESCRICAO VARCHAR2(100));


CREATE SEQUENCE SEQ_TESTE_TREVISOLLI START WITH 1 INCREMENT BY 1;


CREATE OR REPLACE TRIGGER TREVISOLLI.TRG_TESTE_TREVISOLLI
 BEFORE
  INSERT
 ON TREVISOLLI.TESTE_TREVISOLLI
REFERENCING NEW AS NEW OLD AS OLD
 FOR EACH ROW
DECLARE
BEGIN

    IF INSERTING  THEN
      :NEW.COD := SEQ_TESTE_TREVISOLLI.NEXTVAL;
    END IF;
EXCEPTION
  WHEN OTHERS THEN
    RAISE_APPLICATION_ERROR(-20001,SQLERRM||' ERRO - TRG_TESTE_TREVISOLLI');
END;
/


insert into teste_trevisolli (descricao)
                      values ('AZUL');

insert into teste_trevisolli (descricao)
                      values ('AMARELO');                      

commit;

select * from teste_trevisolli;


COD DESCRICAO
--- ---------
1   AZUL     
2   AMARELO  

-- Verificar onde está sendo utilizada:

SELECT *
  FROM DBA_DEPENDENCIES WHERE REFERENCED_NAME='SEQ_TESTE_TREVISOLLI';
  
  
OWNER       NAME                 TYPE    REFERENCED_OWNER REFERENCED_NAME      REFERENCED_TYPE REFERENCED_LINK_NAME DEPENDENCY_TYPE
----------- -------------------- ------- ---------------- -------------------- --------------- -------------------- ---------------
TREVISOLLI TRG_TESTE_TREVISOLLI TRIGGER TREVISOLLI      SEQ_TESTE_TREVISOLLI SEQUENCE        (Null)               HARD           
Uma outra dica, seria procurar na ALL_SOURCE, pela sequence:

Selecionar tudo

select * from all_source where upper(text) like '%SEQ_TESTE%'
Ou, até mesmo, procurar o INSERT na tua tabela, verificando se esse objeto (uma procedure ou package), utiliza a sequence na inserção:

Selecionar tudo

SELECT * FROM ALL_SOURCE WHERE UPPER(TEXT) LIKE '%INSERT%SUA_TABELA%';
Essas são algumas das situações que eu investigaria. Mas, o pessoal do fórum pode agregar mais situações para lhe ajudar.

Sempre lembrando que, todos os testes que realizei, foi partindo do princípio que a chamada da sequence foi realizada em um objeto do banco de dados, e não dentro de um forms (neste caso, você poderia utilizar um comando do MS-DOS, por exemplo, o FINDSTR e procurar dentro do binário).

Espero ter ajudado.
Grande abraço,

Trevisolli
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Pois é...não tem como saber, pois uma sequência pode estar sendo usada em vários locais. Não é como uma PK ou trigger que é vinculada à uma tabela.
É um objeto independente.

Se você quer controlar, acho que a melhor forma é adicionar um comentário na coluna.

Selecionar tudo

COMMENT ON COLUMN tabela.campo IS 'Primary key da tabela, vindo da sequence MY_TABLE_ID_SEQ';
Mesmo assim, tenha em mente que qualquer coisa pode estar atualizando a sequence. Inclusive algo fora do banco, tipo, um script do sql*plus.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 11 visitantes