Colega, seguinte : é falso que um usuário que não tenha priv de CREATE
VIEW possa criar uma view, exemplo :

[EMAIL PROTECTED]:SQL>create user zemane identified by zemane;

Usuário criado.

[EMAIL PROTECTED]:SQL>grant create session to zemane;

Concessão bem-sucedida.

[EMAIL PROTECTED]:SQL>grant select on scott.dept to zemane;

Concessão bem-sucedida.
==> veja que ** REALMENTE ** o usuário não tem o privs de CREATE VIEW :

[EMAIL PROTECTED]:SQL>@privs_by_user

Enter Username : zemane

Roles granted to user

não há linhas selecionadas

Table Privileges granted to a user through roles

não há linhas selecionadas

System Privileges assigned to a user through roles

não há linhas selecionadas

Table privileges assigned directly to a user

OWNER           TABLE_NAME                        PRIVILEGE
--------------- ---------------------------------
---------------------------------
SCOTT           DEPT                              SELECT

System privileges assigned directly to a user

PRIVILEGE                         ADM
--------------------------------- ---
CREATE SESSION                    NO

==> conectando como esse usuário, testo :

[EMAIL PROTECTED]:SQL>select * from scott.dept where rownum < 3;

            DEPTNO DNAME              LOC           R
------------------ ------------------ ------------- -
                10 ACCOUNTING         NEW YORK
                20 RESEARCH           DALLAS

[EMAIL PROTECTED]:SQL>create view V_TESTE as select * from scott.dept where
rownum < 3;
create view V_TESTE as select * from scott.dept where rownum < 3
            *
ERRO na linha 1:
ORA-01031: privilégios insuficientes

yes ??? Segue o script script usado :

[EMAIL PROTECTED]:SQL>get privs_by_user.sql
  1  -- script de check de privs
  2  set echo off
  3  set verify off
  4  set pages 200
  5  col granted_role form a20
  6  col owner form a15
  7  col table_name form a33
  8  col privilege form a33
  9  ACCEPT username  prompt 'Enter Username : '
 10  PROMPT Roles granted to user
 11  SELECT granted_role,admin_option,default_role
 12  FROM dba_role_privs
 13  WHERE grantee=UPPER('&username')
 14  ORDER BY 1;
 15  PROMPT Table Privileges granted to a user through roles
 16  SELECT granted_role, owner, table_name, privilege
 17  FROM ( SELECT granted_role
 18      FROM dba_role_privs WHERE grantee=UPPER('&username')
 19         UNION
 20         SELECT granted_role
 21      FROM role_role_privs
 22      WHERE role in (SELECT granted_role
 23               FROM dba_role_privs WHERE grantee=UPPER('&username')
 24              )
 25     ) roles, dba_tab_privs
 26  WHERE granted_role=grantee
 27  ORder by 1,2,3,4;
 28  PROMPT System Privileges assigned to a user through roles
 29  SELECT granted_role, privilege
 30  FROM ( SELECT granted_role
 31      FROM dba_role_privs WHERE grantee=UPPER('&username')
 32         UNION
 33         SELECT granted_role
 34      FROM role_role_privs
 35      WHERE role in (SELECT granted_role
 36               FROM dba_role_privs WHERE grantee=UPPER('&username')
 37              )
 38     ) roles, dba_sys_privs
 39  WHERE granted_role=grantee
 40   ORDER BY 1,2;
 41  PROMPT Table privileges assigned directly to a user
 42  SELECT owner, table_name, privilege
 43  FROM dba_tab_privs
 44  WHERE grantee=UPPER('&username')
 45  ORDER BY 1,2,3;
 46  PROMPT System privileges assigned directly to a user
 47  SELECT privilege, admin_option
 48  FROM  dba_sys_privs
 49  WHERE grantee=UPPER('&username');
 
==> rode o script e veja lá se na verdade o usuário não recebeu o
privilégio VIA ROLE !!!! Evidentemente, se tal aconteceu, o REVOKE vai
CORRETAMENTE te responder que o priv direto não existe, o que existe é
a role... Exemplo :

[EMAIL PROTECTED]:SQL>grant connect, resource to zemane;

Concessão bem-sucedida.

[EMAIL PROTECTED]:SQL>@privs_by_user
Gravou file D:\dba_scripts\sqlplus_settings.sql
Enter Username : zemane
Roles granted to user

GRANTED_ROLE         ADM DEF
-------------------- --- ---
CONNECT              NO  YES
RESOURCE             NO  YES

Table Privileges granted to a user through roles

não há linhas selecionadas

System Privileges assigned to a user through roles

GRANTED_ROLE         PRIVILEGE
-------------------- ---------------------------------
CONNECT              ALTER SESSION
CONNECT              CREATE CLUSTER
CONNECT              CREATE DATABASE LINK
CONNECT              CREATE SEQUENCE
CONNECT              CREATE SESSION
CONNECT              CREATE SYNONYM
CONNECT              CREATE TABLE
CONNECT              CREATE VIEW
RESOURCE             CREATE CLUSTER
RESOURCE             CREATE INDEXTYPE
RESOURCE             CREATE OPERATOR
RESOURCE             CREATE PROCEDURE
RESOURCE             CREATE SEQUENCE
RESOURCE             CREATE TABLE
RESOURCE             CREATE TRIGGER
RESOURCE             CREATE TYPE

16 linhas selecionadas.

Table privileges assigned directly to a user

OWNER           TABLE_NAME                        PRIVILEGE
--------------- ---------------------------------
---------------------------------
SCOTT           DEPT                              SELECT

System privileges assigned directly to a user

PRIVILEGE                         ADM
--------------------------------- ---
CREATE SESSION                    NO
UNLIMITED TABLESPACE              NO

==> viu a role CONNECT *** implicitamente ** deu CREATE VIEW pro
cara... Se eu tentar REVOKAR, como eu disse NÂO funciona pois o
usuário NÂO RECEBEU esse priv diretamente :

[EMAIL PROTECTED]:SQL>revoke create view from zemane;

revoke create view from zemane
*
ERRO na linha 1:
ORA-01952: os privilégios de sistema não concederam para 'ZEMANE'

Sim ???? Caso não seja esse o caso, outra possibilidade é que o CREATE
VIEW simplesmente foi dado para PUBLIC, aí qquer um o tem, INCLUSIVE
esse usuário...

 Quanto às sua outra dúvida : a view (pensando sempre em views
"simples", view materializada é OUTRA coisa), NADA MAIS É do que uma
query, do que um TEXTO CONTENDO UM SELECT, texto esse armazenado no
banco de dados na tablespace SYSTEM, junto com outros textos
similares, tais como as Procedures, Triggers, ok ? Quando vc faz um
SELECT nn  FROM nomedaview, o que ocorre é que o TEXTO DO SELECT da
view é lido e RE-executado , a view *** NÂO POSSUI *** registros, ela
é uma consulta em cima de tabelas reais, e a cada vez que vc aciona a
view, a consulta é refeita e os dados são puxados da tabela real, NADA
MAIS QUE isso, portanto NÂO HÁ o que dados que guardar em tablespace
alguma, certo ?? Há muitos livros-texto que dizem que a view é como se
fosse uma "sub-tabela", que "armazena" registros que vêm da tabela
real citada no select - TODOS esses livros-textos estão simplesmente
ERRADOS, tá ? Vc pode comprovar isso não só lendo a documentação
oficial Oracle, como também consultando as views do sistema que
mostram consumo nas tablespaces (ie, DBA_EXTENTS e DBA_SEGMENTS), veja
lá que vc NUNCA vai achar lá área NENHUMA ocupada por "dados de uma
view", isso não existe, ponto.

[]s

 Chiappa
--- Em oracle_br@yahoogrupos.com.br, "Ronaldo Pinto"
<[EMAIL PROTECTED]> escreveu
>
> Olá a todos!
> Fazendo alguns testes no banco de estudos 9i percebí que quando um
usuario
> recebe permissão de select em uma tabela, ele consegue criar views
naquela
> tabela mesmo não tendo o privilégio "create view".
> As dúvidas são:
> Se o usuário não tem cota em nenhuma tablespace, onde as informações
dessa
> view são guardadas?
> O fato do usuário não ter o privilégio de "create view" não deveria
> impedí-lo de criar views?
> Como posso remover esse privilégio? Tentei "revoke" e recebo a
informação de
> que o privilégio não foi aplicado.
> 
> Obrigado pelos esclarecimentos,
> 
> Ronaldo
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
>


Responder a