Use BEQUEATH CURRENT_USER views

Em versões anteriores a 12c, ao se trabalhar com views em que tinha um function no select list, poderia existir um comportamento indesejado. Acontece que mesmo que as funções tivesse a cláusula AUTHID CURRENT_USER, essa função sendo utilizada em uma view sempre iria ser executar com os privilégios do owner da view, ou seja, como se fosse com o AUTHID DEFINER. Um comportamento indesejado, e até mesmo não percebido por muitos.

A partir da versão 12c Release 1 do Oracle, foi introduzida uma nova cláusula, a BEQUEATH CURRENT_USER ou então a BEQUEATH DEFINER, este último é o default ao se criar uma view. Lembrando que esta cláusula muda apenas o comportamento das FUNCTIONS que existe no SELECT LIST da VIEW, e não a view como um todo!
Para demonstrar o uso dessas cláusulas, vamos criar duas functions e duas views utilizando essas functions. Uma function terá a cláusula BEQUEATH CURRENT_USER e a outra BEQUEATH DEFINER. Iremos utilizar também duas funções para demonstrar o uso dessas cláusulas, a função ORA_INVOKING_USER que retorna o nome do usuário que está invocando, INVOKER, e a função ORA_INVOKING_USERID que retorna o USERID do usuário invocando a view ou o statement. No meu caso, se for executado com o usuário SYSTEM, irá retornar o usuário SYSTEM com USERID 9. Com o usuário TERCIO irá retornar TERCIO com USERID 133.


conn tercio/oraclepress
CREATE OR REPLACE FUNCTION exemplo_bequeath
RETURN VARCHAR2
AUTHID CURRENT_USER
AS
retorno VARCHAR2(100);
BEGIN
SELECT ora_invoking_user || ' : ' || ora_invoking_userid
INTO retorno
FROM dual;

RETURN retorno;
END;
/

CREATE OR REPLACE VIEW tercio.bequeath_current_user BEQUEATH CURRENT_USER AS
SELECT tercio.exemplo_bequeath AS INVOKER
FROM DUAL;

CREATE OR REPLACE VIEW tercio.bequeath_definer BEQUEATH DEFINER AS
SELECT tercio.exemplo_bequeath AS INVOKER
FROM DUAL;

A função exemplo_bequeath foi criada com o AUTHID CURRENT_USER, ou seja, o resultado dessa function dependerá sempre de quem está invocando. Logo após foi criada duas views, idênticas, mudando apenas a cláusula BEQUEATH, uma sendo CURRENT_USER e a outra view sendo DEFINER, que é o valor default ao se criar uma view. Vamos testar agora o resultado utilizando essas views com o usuário SYSTEM, veja esse exemplo abaixo.


conn system/oracle
SQL> SELECT INVOKER FROM tercio.bequeath_current_user;

INVOKER
---------------------------------------------------------------------------
SYSTEM : 9

SQL> SELECT INVOKER FROM tercio.bequeath_definer;

INVOKER
---------------------------------------------------------------------------
TERCIO : 133

No primeiro teste, utilizando a view tercio.bequeath_current_user foi retornado um VARCHAR2 com o valor de SYSTEM : 9. Então, tudo aconteceu conforme desejado, já que a função foi criada com o AUTHID CURRENT_USER. A função se comportou como se tivesse sido utilizada fora da view.

Já no segundo teste, utilizando a view tercio.bequeath_definer, o resultado foi diferente. A view retornou o VARCHAR2 TERCIO : 133, mesmo com a função tendo sido criada com a cláusula AUTHID CURRENT_USER. Isso acontece porque com a cláusula BEQUEATH DEFINER, a função sempre irá executar com os rights do owner da view, nesse caso o usuário TERCIO, e era assim que sempre acontecia em versões anteriores ao Oracle 12cR1.

Anúncios

Meu nome é Tércio Costa, sou formado em Ciências da Computação pela UFPB, tenho a certificação Oracle SQL Expert, mantendo um blog reconhecido pela OTN(oraclepress.wordpress.com), no qual também publico artigos técnicos no portal OTN, no portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine. Além de tudo isto sou um Oracle ACE Associate por estar sempre contribuindo para a comunidade com um bom nível de expertise.

Marcado com: ,
Publicado em Sem categoria

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Esse Blog é reconhecido pela
Certificações
Sou articulista
Sou articulista

Clique para seguir este blog e receber notificações via email de novos posts.

Tércio Costa

Tércio Costa

Meu nome é Tércio Costa, sou formado em Ciências da Computação pela UFPB, tenho a certificação Oracle SQL Expert, mantendo um blog reconhecido pela OTN(oraclepress.wordpress.com), no qual também publico artigos técnicos no portal OTN, no portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine. Além de tudo isto sou um Oracle ACE Associate por estar sempre contribuindo para a comunidade com um bom nível de expertise.

Links Pessoais

Serviços verificados

Visualizar Perfil Completo →

Total de Visualizações da Página
  • 91.132 Visualizações
%d blogueiros gostam disto: