Concedendo acesso somente leitura a um esquema Oracle existente

3

temos um esquema Oracle 11g que nosso aplicativo usa para selecionar, inserir e atualizar, mas recebemos uma solicitação de um de nossos clientes para fornecer acesso somente leitura às mesmas tabelas de base e visualizações de propriedade da aplicação.

Além de fazer com que todas as tabelas do aplicativo pertencessem a uma nova conta (ou tornar os sinônimos públicos), como eu faria isso?

Qualquer ajuda ou ponteiros para a abordagem ou recurso do Oracle que eu deveria estar olhando seria muito apreciado, obrigado!

    
por Andrew 31.07.2009 / 17:04

3 respostas

8

Você precisará de uma conta separada para conceder acesso somente leitura. Sugiro adicionar uma função à qual você também conceda acesso somente leitura. Você poderá reutilizar essa função se mais usuários precisarem desse acesso no futuro.

CREATE ROLE my_read_only_role;

BEGIN
  FOR x IN (SELECT table_name FROM dba_tables WHERE owner=<<schema name>>)
  LOOP
    EXECUTE IMMEDIATE 'GRANT SELECT ON ' || x.table_name || ' TO my_read_only_role';
  END LOOP;
  FOR y IN (SELECT view_name FROM dba_views WHERE owner=<<schema name>>)
  LOOP
    EXECUTE IMMEDIATE 'GRANT SELECT ON ' || y.view_name || ' TO my_read_only_role';
  END LOOP;
END;
/

GRANT my_read_only_role TO new_customer_account;

Uma vez feito isso, a nova conta precisará prefixar os nomes das tabelas com o nome do esquema para selecionar os dados. Alternativamente, você poderia criar sinônimos públicos para cada objeto (você pode adicionar outro EXECUTE IMMEDIATE a cada loop no código acima). Ou você pode fazer o usuário executar o comando

ALTER SESSION SET current_schema = <<schema name>>

no login. Você também pode criar um gatilho de login na nova conta que faria isso automaticamente. Isso fará com que <<schema name>> seja incluído implicitamente como o prefixo do esquema. Ele não afeta os privilégios da sessão - o usuário ainda tem privilégios de somente leitura, o nome do esquema padrão acaba de ser alterado.

    
por 31.07.2009 / 22:03
2

Eu criei o new_customer_account sem cotas como sysdba:

create user new_customer_account
  IDENTIFIED BY new_password
  DEFAULT TABLESPACE USERS
  TEMPORARY TABLESPACE TMP
  PROFILE DEFAULT
  ACCOUNT UNLOCK;
GRANT CONNECT TO new_customer_account;
GRANT CREATE SESSION TO new_customer_account;
ALTER USER new_customer_account QUOTA 0 ON users;

O aplicativo_usuário concedeu o direito de seleção no campo relevante visualizações (e / ou tabelas):

BEGIN
 FOR i IN (SELECT *
             FROM all_views
            WHERE owner = ''
              AND relevant_where_clause) LOOP
  EXECUTE IMMEDIATE 'GRANT SELECT ON application_user.'
          || i.view_name || ' TO new_customer_account';
 END LOOP;
END;

Depois disso, o new_customer_account cria novos sinônimos:

BEGIN
 FOR i IN (SELECT *
             FROM all_views
            WHERE owner = 'application_user'
              AND relevant_where_clause) LOOP
  EXECUTE IMMEDIATE 'CREATE SYNONYM ' || i.view_name
          || ' FOR application_user.' || i.view_name;
 END LOOP;
END;
    
por 17.01.2011 / 12:33
1

Tenho certeza de que você precisa criar uma nova conta e conceder apenas seleção para esse usuário.

    
por 31.07.2009 / 18:21