CHANGE NOTIFICATION

DBA Geral (instalação, configuração do banco, scripts do Sql*Plus, shell scripts, batch scripts, etc...)
Responder
PedroFBPereira
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 29 Abr 2014 8:11 pm

Tenho uma aplicação dotNet dando erro ao conectar em um banco Oracle 11 g.
"The Database Change Notification feature is not supported by this version of the database."
Oracle 11g suporta Change Notification, ela foi até mesmo melhorada nesta versão.
Já revisei se usuário que estou usando tem permissões para CHANGE NOTIFICATION e EXECUTE em DBMS_CHANGE_NOTIFICATION. Tudo OK.
Dicas? Sugestões?
Avatar do usuário
fbifabio
Moderador
Moderador
Mensagens: 199
Registrado em: Ter, 22 Fev 2011 1:51 pm
Localização: São Paulo - SP
Contato:
Fábio Prado
www.fabioprado.net

@PedroFBPereira,

Eu nunca usei este recurso, mas é bem provável que você não está conseguindo utilizá-lo porque ele só deve funcionar no Oracle Enterprise Edition. Execute um SELECT na visão V$VERSION e veja que edição ou versão do Oracle você está utilizando, ok?

Obs.: Muitos recursos do Oracle Database não funcionam em Standard ou Express Edition.


[]s
PedroFBPereira
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 29 Abr 2014 8:11 pm

Obrigado pelo auxílio!
Mas não sei se eu entendi direito. VSVersion seria uma view? Esse objeto não existe no meu banco!
:-(

Questão: eu rodei comandos PL-SQL que usam CHANGE NOTIFICATION, "dentro" do banco, logado como o usuário que a minha aplicação.Net usa. Pareceu funcionar tudo normal. Isso não quer dizer que a feature existe? Veja abaixo os comandos que usei (copiei da documentação da Oracle, com pequenos ajustes).

Selecionar tudo

Rem create a table to record changes to registered tables
CREATE TABLE nftablechanges(regid number, table_name varchar2(100),
                            table_operation number);
 
Rem create a table to record rowids of changed rows.
CREATE TABLE nfrowchanges(regid number, table_name varchar2(100), 
                          row_id varchar2(30));
 
Rem Create a PL/SQL callback handler to process notifications.
CREATE OR REPLACE PROCEDURE chnf_callback(ntfnds IN SYS.CHNF$_DESC) IS
   regid           NUMBER;
   tbname          VARCHAR2(60);
   event_type      NUMBER;
   numtables       NUMBER;
   operation_type  NUMBER;
   numrows         NUMBER;
   row_id          VARCHAR2(20);
 BEGIN
     regid      := ntfnds.registration_id;
     numtables  := ntfnds.numtables;
     event_type := ntfnds.event_type;
 
  INSERT INTO nfevents VALUES(regid, event_type);
  IF (event_type = DBMS_CHANGE_NOTIFICATION.EVENT_OBJCHANGE) THEN
    FOR i IN 1..numtables LOOP
      tbname          := ntfnds.table_desc_array(i).table_name;
      operation_type  := ntfnds.table_desc_array(I). Opflags;
      INSERT INTO nftablechanges VALUES(regid, tbname, operation_type);
      /* Send the table name and operation_type to client side listener using UTL_HTTP */
      /* If interested in the rowids, obtain them as follows */
      IF (bitand(operation_type, DBMS_CHANGE_NOTIFICATION.ALL_ROWS) = 0) THEN
        numrows := ntfnds.table_desc_array(i).numrows;
      ELSE 
        numrows :=0;   /* ROWID INFO NOT AVAILABLE */
      END IF;
      
      /* The body of the loop is not executed when numrows is ZERO */
      FOR j IN 1..numrows LOOP
          Row_id := ntfnds.table_desc_array(i).row_desc_array(j).row_id;
          INSERT INTO nfrowchanges VALUES(regid, tbname, Row_id);
         /* optionally Send out row_ids to client side listener using UTL_HTTP; */
      END LOOP;
      
    END LOOP;
  END IF;
  COMMIT;
END;
/ 

Rem Create a REGISTRATION on the EMPLOYEES TABLE    
DECLARE
  REGDS      SYS.CHNF$_REG_INFO;
  regid      NUMBER;
  family_key     NUMBER;
  dept_id    NUMBER;
  qosflags   NUMBER;
BEGIN
 qosflags := DBMS_CHANGE_NOTIFICATION.QOS_RELIABLE +
         DBMS_CHANGE_NOTIFICATION.QOS_ROWIDS;
REGDS := SYS.CHNF$_REG_INFO ('chnf_callback', qosflags, 0,0,0);
regid := DBMS_CHANGE_NOTIFICATION.NEW_REG_START (REGDS); 
SELECT fmly_key INTO family_key FROM mi_families WHERE fmly_caption_tx = 'Equipment';
DBMS_CHANGE_NOTIFICATION.REG_END;
END;
/

SELECT * FROM nfevents;
SELECT * FROM nftablechanges;
select * from nfrowchanges;

select fmly_caption_tx, fmly_desc_tx, fmly_key from mi_families where fmly_caption_tx = 'Equipment';

UPDATE mi_families SET fmly_desc_tx = 'Equipment Updated' where fmly_caption_tx = 'Equipment';
COMMIT;

SELECT * FROM nfevents;
SELECT * FROM nftablechanges;
select * from nfrowchanges;
Avatar do usuário
fbifabio
Moderador
Moderador
Mensagens: 199
Registrado em: Ter, 22 Fev 2011 1:51 pm
Localização: São Paulo - SP
Contato:
Fábio Prado
www.fabioprado.net

V$VERSION é uma view que existe em qualquer Oracle Database. Consulte-a conectado como SYS.

Quando aparece uma msg contendo "...feature is not supported by this version of the database." normalmente é por causa do que eu lhe falei.

[]s
PedroFBPereira
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 29 Abr 2014 8:11 pm

Não consigo encontrar o VSVersion...
Estou conectado como um usuario que "teoricamente" tem permissões de Admin...
Faço

Selecionar tudo

select * from sys.vsversion
e me diz que "table ou view não existe".
:-(
PedroFBPereira
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 29 Abr 2014 8:11 pm

Pesquisei as diferenças entre 11g Enterprise e 11g.
Nem encontrei Change Notification... :-(
Talvez esteja relacionado a "Query Cache"?
PedroFBPereira
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 29 Abr 2014 8:11 pm

Usar um client 10g com um server 11g poderia causar este tipo de problema?
Avatar do usuário
fbifabio
Moderador
Moderador
Mensagens: 199
Registrado em: Ter, 22 Fev 2011 1:51 pm
Localização: São Paulo - SP
Contato:
Fábio Prado
www.fabioprado.net

@PedroFBPereira,

você está digitando o nome da visão errado. Copie o código abaixo e execute no seu BD:

Selecionar tudo

select * from sys.v$version

[]s
PedroFBPereira
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 29 Abr 2014 8:11 pm

Table or view does not exist.
Tentei com um usuário "comum" e com outro que "deve" ter grants de admin.
:-(
Avatar do usuário
fbifabio
Moderador
Moderador
Mensagens: 199
Registrado em: Ter, 22 Fev 2011 1:51 pm
Localização: São Paulo - SP
Contato:
Fábio Prado
www.fabioprado.net

@PedroFBPereira

Usuário comum não tem acesso à visão V$VERSION. É necessário executar a consulta com um usuário que realmente tenha privilégios administrativos no BD. Peça para o DBA executá-la conectado como SYS, te mandar o resultado e poste-o aqui para nós.

[]s
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

Aqui tem outras formas de ver a versão:
http://glufke.net/oracle/viewtopic.php?t=248

Nessa tabela tem como ver as fetures:

Selecionar tudo

select * from DBA_FEATURE_USAGE_STATISTICS
(mas não achei nada de Change Notification ali)

Você chegou a fazer grant?

Selecionar tudo

grant change notification to USUARIO
http://docs.oracle.com/cd/E11882_01/jav ... JJDBC28815


Aqui tem um passo a passo:
http://www.oracle.com/webfolder/technet ... hg_otn.htm
PedroFBPereira
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 29 Abr 2014 8:11 pm

O grant foi feito... Nos primeiros capítulos da novela! :-(
Obrigado pelo passo-a-passo!
danilo_zg
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 14
Registrado em: Qui, 04 Mar 2010 9:30 am
Localização: Jundiaí - SP

Pedro, a sintaxe que você postou está incorreta

Selecionar tudo

select * from sys.v$version
com $ de dólar mesmo.
o que você postos está como

Selecionar tudo

select * from sys.vsversion 
com a letra S.

Verifique se foi este o equívoco.
PedroFBPereira
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 29 Abr 2014 8:11 pm

Danilo, muito obrigado pelo apoio!
Eu tentei com "esse", eu tentei com "dólar", nada funcionava.
Até que de repente começou a funcionar!
Nem preciso digitar "SYS.v$version".
Só posso imaginar que o DBA Admin se deu conta que tinha me dado as permissões erradas, foi lá e corrigiu!

Então a questão que ainda está me atormentando é
"Oracle 11g Standard suporta Change Notification?"
"Isto é padrão ou é preciso alguma licença específica?"
"Onde, na documentação Oracle, isto está declarado?"

Fico aqui na esperança...
Avatar do usuário
fbifabio
Moderador
Moderador
Mensagens: 199
Registrado em: Ter, 22 Fev 2011 1:51 pm
Localização: São Paulo - SP
Contato:
Fábio Prado
www.fabioprado.net

@PedroFBPereira

Agora que sabemos que seu Bd é Standard Edition fica mais fácil te ajudar.

você já sabe que a feature Database Change Notification (dbms_change_notification) não funciona na Standard Edition, pois a mensagem de erro que retornou p/ você é clara e diz exatamente que o recurso não é suportado na sua versão do BD. Isso é comum, existem muitos recursos que não funcionam no Oracle Standard Edition (ver lista completa em http://www.oracle.com/us/products/datab ... index.html. Consultando os links abaixo, não consegui identificar nenhuma informação sobre essa feature necessitar de licenciamento adicional na versão Enterprise Edition, portanto, sugiro que você entre em contato com algum LMS Consultant da Oracle (Ex.: arnaldo.tramontano@oracle.com) e faça esse questionamento. Depois que descobrir, por favor, registre aqui e compartilhe o conhecimento... assim como você, outros precisarão dessa resposta!

- Database Change Notification: http://docs.oracle.com/cd/E11882_01/jav ... JJDBC28815
- Options and Packs: http://docs.oracle.com/cd/B28359_01/lic ... m#DBLIC164

[]s
PedroFBPereira
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 29 Abr 2014 8:11 pm

Pessoal, muito obrigado pela ajuda!
Eu acho que consegui resolver o problema.
A causa era que minha aplicação .Net usa ODP.Net para conectar ao Oracle.
Portanto, eu precisava atualizar o ODP.Net para a versão 11g, caso contrário não seria capaz de conectar a um Oracle 11g!

Mas quando eu fiz a instalação da nova versão do ODP.Net, um outro problema surgiu.
Parece que o arquivo TNSNAMES.ora é "visível" à minha aplicação quando estou usando a máquina "localmente", ou seja, usando-a diretamente ou através de Remote Desktop.
Quando tento ativar a aplicação através da rede, ou usando Citrix, aparentemente o TNSNAMES.ora não é encontrado, porque os ALIASES não são resolvidos!

Alguma dica sobre como resolver isso?
Valeu!
PedroFBPereira
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 29 Abr 2014 8:11 pm

Tudo resolvido! Era só reiniciar o IIS depois de atualizar o ODP.Net! está bombando agora! :-)
Responder
  • Informação
  • Quem está online

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