[oracle_br] Re: Trigger de logon...
Bom, é um negócio de louco Desenvolvedores terem acesso de qquer forma ao banco PROD (ninguém duvida que o CERTO era ninguém da turam de desenvolvedores ter acesso e ponto, sem necessidade de trigger algum), mas sobre isso já falamos nesta thread, mas tá : agora, antes de focar no comportamento, vc tem um erro lógico aí nesse código : pra começo de conversa, UPPER significa ** converta para MAIÚSCULO ** , então linhas como : IF UPPER (owner) NOT IN ('cbarbosa' ou OR UPPER (v_prog) LIKE '%SQL Developer%' -- SQL Developer * NUNCA ** vão funcionar logicamente falando, pois um UPPER ** nunca ** é igual a 'cbarbosa' ,NUNCA vai ser like 'SQL Developer', pois essas strings contém minúsculas, okdoc ??? CORRIJA ISSO, please Sobre o que vc reporta : vc tem TOTAL CERTEZA que está conectado no database correto ? Quando vc executou o CREATE OR REPLACE TRIGGER , vc REALMENTE estava conectado como SYS ??? A ferramenta-cliente Realmente deu MESMO mensagem de Trigger Created ou similar ?? Tenta refazer o CREATE OR REPLACE trigger conectando como SYS no tal database PROD via SQLPLUS, pois essa tool mostra Claramente as msgs de sucesso ou falha num DDL... SE vc recriar com sucesso no sqlplus, Recebendo a msg de criação, mas ainda assim quando ela disparar vc obter algum tipo de erro, a gente pensa principalmente na questão da CONCATENAÇÃO que vc faz : confirmar que não há nenhuma aspinha irregular, E que as strings que vc tá concatenando no total são ** MENORES ** do que os 2000 bytes que a RAISE_APPLICATION_ERROR permite na mensagem, ok ? Pode valer muito a pena vc, pra fins de debug, substituir as strings concatenadas por uma msg fixa única, que vc sabe que tá menor que esse limite... []s Chiappa
[oracle_br] Re: Trigger de Logon.
Opa : então, primeiro eu sou ** obrigado ** a te dizer que restringir acesso por ferramenta cliente é algo que o RDBMS Oracle absolutamente Não Prevê : o fato é que o RDBMS tá pouco se lixando pra qual ferramenta vc usou pra exercer seu direito de conexão no database (a preocupação dos desenvolvedores do RDBMS Oracle é em comprovar que vc tem direito a acessar o database, com o que vc vai acessar não importa pra ele), E além disso numa aplicação moderna tipicamente o RDBMS ** nem sequer ENXERGA a máquina do usuário-final (pois ele conecta num pool de conexões, e não diretamente ao database)... Ademais, o database NÂO CONTROLA quais programas estão solicitando conexão, assim depende TOTALMENTE da informação que o programa-cliente dá : Assim sendo, se vc montar um trigger que faça um IF nomedoprogramaconectando = 'SQLPLUS.EXE' , para isso ser burlado basta o usuário RENOMEAR o arquivo SQLPLUS.EXE para OUTRACOISA.EXE... :) Segundo ponto : normalmente quando a pessoa quer restringir o acesso ao database apenas pela Aplicação, isso indica que se o usuário acessar por fora há Risco de quebra de integridade/segurança - tipicamente, há alguma regra de negócio e/ou alguma Integridade de dados que ao invés de ser mantida DENTRO DO DATABASE (caso em que a validação SEMPRE ocorre, independente de qquer coisa) neguim criou a tal regra/validação/integridade DENTRO DA APLICAÇÃO, aí se acessar o banco fora da aplicação é kaput... Se for esse o seu motivo, pense ** seriamente ** em tornar a sua aplicação DATABASE-centric, passando as tais regras/validações para dentro do database, que é onde elas Pertencem... Sempre, o que se refere a DADOS fica necessariamente DENTRO DO DATABASE... Mas se ainda assim vc quiser ter um trigger de LOGON que faça isso, veja o exemplo em https://asktom.oracle.com/pls/apex/f?p=100:11:0P11_QUESTION_ID:561622956788 ... Agora : imho muito mais Efetivo (se é que essa palavra cabe num quebra-galho/gambi do tipo implícito em tasks estranhas como bloquear acesso por tool cliente) seria OU vc não dar Acesso às tabelas da Aplicação se a pessoa não conectar pela aplicação (digamos, há uma trigger WHEN-NEW-FORM-INSTANCE que faz um ALTER SESSION que libera o acesso às tabelas ativando uma ROLE, ou popula um context que vai ser exigido numa política de FGA que vc criou no database, algo do tipo), OU então vc fazer o controle após o fato, ie : ter um job de banco que de minuto em minuto dispara e mata as sessões que não setaram algum valor predeterminado via DBMS_APPLICATION_INFO ou alguma coisa assim que as tools clientes não fazem e vc programaria tua aplicação para fazer []s Chiappa
Re: [oracle_br] Re: trigger de logon
Obrigado Braga e chiappa pelas informações. Agora compreendi a funcionalidade. Estaremos resolvendo o problema nas aplicações. Grato a todos Em 15 de abril de 2010 08:49, José Laurindo jlchia...@yahoo.com.brescreveu: Pelo que entendi não é isso não, o colega tá reclamando do ORA-00604: ocorreu um erro no nível 1 SQL recursivo , e isso ** não ** é causado pelo userenv : na verdade, sendo essa a pergunta, em verdade isso ** não é problema Algum ** , o client Oracle está programado para listar exceções, cfrme http://asktom.oracle.com/pls/asktom/f?p=100:11:0P11_QUESTION_ID:68817379083269... Não tem como tirar o 604 do error stack, MAS a Aplicação dele tranquilamente pode ser programada para não exibir o stack de erros todo, o sqlplus porém (deve ser isso que ele está usando) não pode ... []s Chiappa --- Em oracle_br@yahoogrupos.com.br oracle_br%40yahoogrupos.com.br, Marcos Braga braga.mar...@... escreveu Olá Miguel, O que observei de diferente na sua trigger foi a utilização do USERENV. Ao invés de utilizar: USERENV('SESSIONID') Tente: SYS_CONTEXT('USERENV', 'SESSIONID') Verifique se pode ser isso. []s Braga Em 14 de abril de 2010 17:32, Miguel Angelo Rodrigues miguelangelo.rodrig...@... escreveu: Senhores, estou com uma trigger para controlar o acesso dos usuario no ambiente de produção. Ela está funcionando, porem apresenta o erro de sql recursivo. A versão do oracle é 10.2.0.3.0. Fico grato com a ajuda de vcs. Segue a trigger e o erro: create or replace trigger log_restriction after logon on database begin for x in ( select CLIENT_IDENTIFIER, program from sys.v_$session where audsid = sys_context('userenv', 'sessionid') ) loop if ltrim(rtrim(x.CLIENT_IDENTIFIER)) not in ('10.11.7.230','10.11.7.216','10.1.1.48','10.1.1.28' ,'10.1.1.15','127.0.0.1','10.1.1.31','200.198.213.112','200.198.202.105','10.1.1.36') or upper(ltrim(rtrim(x.program))) not in ( 'AETI.EXE' ,'SIRCX.EXE' ,'EQCASSERVICE.EXE' ,'SRVAQUISICAO.EXE' ,'SRVSOPHIABIB.EXE' ,'SRVBIB.EXE' ,'BIBLI.EXE' ,'MONC.EXE' ,'BIBCONF.EXE') then raise_application_error( -20999, 'USUÁRIO OU APLICAÇÃO NÃO AUTORIZADO PARA USO NO AMBIENTE DE PRODUÇÃO!'); end if; end loop; end log_restriction; / ORA-00604: ocorreu um erro no nível 1 SQL recursivo ORA-20999: USUÁRIO OU APLICAÇÃO NÃO AUTORIZADO PARA USO NO AMBIENTE DE PRODUÇÃO! -- Miguel Angelo Rodrigues da Silva Administrador de Banco de Dados Oracle [As partes desta mensagem que não continham texto foram removidas] -- Miguel Angelo Rodrigues da Silva Administrador de Banco de Dados Oracle [As partes desta mensagem que não continham texto foram removidas] -- Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -- Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: http://www.oraclebr.com.br/ Links do Yahoo! Grupos * Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/oracle_br/ * Para sair deste grupo, envie um e-mail para: oracle_br-unsubscr...@yahoogrupos.com.br * O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html
[oracle_br] Re: Trigger de Logon
O trigger em si funciona em versões inferiores à 10g , o que ocorrerá (em ququer versão), é CLARO, é que a lógica vai funcionar ENQUANTO o usuário não baixar pela internet um dos n+1! freewares e sharewaresque conectam no banco, é simplesmente ** IMPRATICÁVEL ** vc ter uma lista de todos os progs clientes possíveis, a cada minuto (ou quase :) aparece mais um... E isso sem contar que MUITAS tools/linguagens/progs ** não ** preenchem a coluna PROGRAM na v$session, se os seus usuários usarem uma dessa, sorry... == Justamente por causa de coisas do tipo é que normalmente é considerado INÚTIL se tentar bloquear tools, o que se pode e deve fazer normalmente é limitar o usuário em si, não importando a tool - esuqemas mirabolantes de bloquear tools só funcionam SE a Empresa tem uma política RÍGIDA de proibir baixar/instalar freewares e tools não-homologadas, e SE for isso que ocorre muito + fácil seria a empresa só homologar sqlplus, toad e similares comerciais aonde vc TEM COMO, dentro de config da própria ferramenta, limitar ações de usuário. []s Chiappa === Participe do ENPO - Encontro de Profissionais Oracle 2006 ! Informações e inscrições em www.enpo-br.org José Laurindo Chiappa, Palestrante ENPO-2006 === --- Em oracle_br@yahoogrupos.com.br, Cristian [EMAIL PROTECTED] escreveu Caro Berrondo, uso uma trigger AFTER LOGON ON DATABASE, não sei se funciona em todas as versões, no Oracle 10g funciona: CREATE OR REPLACE TRIGGER SYS.BLOCK_TOOLS_FROM_PROD AFTER LOGON ON DATABASE DECLARE v_prog sys.v_$session.program%TYPE; ownersys.v_$session.username%TYPE; v_osuser sys.v_$session.osuser%TYPE; BEGIN SELECT program, username, osuser INTO v_prog, owner, v_osuser FROM sys.v_$session WHERE audsid = USERENV('SESSIONID') AND audsid != 0 -- Don't Check SYS Connections AND rownum = 1; -- Parallel processes will have the same AUDSID's IF UPPER(owner) NOT IN ('usuarios_liberados'.) THEN IF UPPER(v_prog) LIKE '%TOAD%' OR UPPER(v_prog) LIKE '%T.O.A.D%' OR -- Toad UPPER(v_prog) LIKE '%SQLNAV%'OR -- SQL Navigator UPPER(v_prog) LIKE '%PLSQLDEV%' OR -- PLSQL Developer UPPER(v_prog) LIKE '%BUSOBJ%'OR -- Business Objects UPPER(v_prog) LIKE '%EXCEL%' OR -- MS-Excel plug-in UPPER(v_prog) LIKE '%SQLPLUS%' OR -- SQLPLUS UPPER(v_prog) LIKE '%DEVELOPER%' OR -- Oracle SQL Developer UPPER(v_prog) LIKE '%IFBLD%' OR -- Oracle Forms Developer Builder UPPER(v_prog) LIKE '%RWBUILDER%' OR -- Oracle Reports Builder UPPER(v_prog) LIKE '%RAPTOR%'-- Oracle Raptor THEN RAISE_APPLICATION_ERROR(-2, 'Development tools are not allowed on PRODUCTION DATABASE! ('||v_osuser||' - '||owner||' - '||v_prog||')'); END IF; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; END; abraços, Cristian. rberrondo wrote: Preciso fazer uma trigger para evento a nível de banco/instancia. Toda vez que uma conexão é estabelecida, faria a checagem de usuário, aplicação e IP, se não estivesse de acordo com as regras , mataria a sessão. Alguem teria algum scprit para isto? Grata R Berrondo AD -- Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ --__ Vem aí: ENPO-BR 2006 - Encontro Nacional de Profissionais Oracle VISITE: http://www.enpo-br.org/ - Dia 11/11 Vagas Limitadas __ Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine Links do Yahoo! Grupos * Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/oracle_br/ * Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] * O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html