Estou testando o Oracle 12c para nosso aplicativo. Eu tenho algo semelhante a essa visão em um esquema específico, que chamaremos MY_OWNER_SCHEMA
para esta pergunta:
CREATE OR REPLACE VIEW OBJECT_COMMENTS AS
SELECT OBJS.OWNER, OBJS.OBJECT_NAME, COMMENTS.COMMENTS
FROM ALL_OBJECTS OBJS
LEFT JOIN ALL_TAB_COMMENTS COMMENTS ON (
COMMENTS.OWNER = OBJS.OWNER
AND COMMENTS.TABLE_NAME = OBJS.OBJECT_NAME
)
WHERE
OBJS.OWNER = 'MY_OWNER_SCHEMA'
AND OBJS.OBJECT_TYPE IN ('TABLE', 'VIEW')
WITH READ ONLY
;
A exibição é uma espécie de exibição de "metadados", usada para verificar (programaticamente) que todas as tabelas e exibições têm um comentário. Como MY_OWNER_SCHEMA
está bloqueado, exceto durante a implantação, concedemos permissões para MY_LOGIN_USER
a SELECT
partir dele:
GRANT SELECT ON OBJECT_COMMENTS TO MY_LOGIN_USER;
(Isso GRANT
é executado durante a implantação enquanto estiver conectado como MY_OWNER_SCHEMA
.)
Isso funcionou muito bem no Oracle 11g, e criá-lo também funciona no 12c. No entanto, apenas no 12c, a GRANT
falha com a seguinte mensagem:
SQL Error: ORA-01720: grant option does not exist for 'SYS.ALL_OBJECTS'
01720. 00000 - "grant option does not exist for '%s.%s'"
*Cause: A grant was being performed on a view or a view was being replaced
and the grant option was not present for an underlying object.
*Action: Obtain the grant option on all underlying objects of the view or
revoke existing grants on the view.
Isso é bastante estranho, pois ALL_OBJECTS
é uma interface pública acessível a todos os usuários, e mostra apenas objetos aos quais o usuário já tem algum acesso. Alguma coisa mudou com o modelo de permissões ou as configurações de permissões padrão no Oracle 12c? É possível que o banco de dados tenha sido instalado de forma diferente? Existe uma maneira de contornar esse erro sem dar MY_OWNER_SCHEMA
permissão explícita GRANT
a essa visão global do sistema?
Sim, use
READ
privilégio (introduzido em 12c) em vez deSELECT
.Acima falha, mas: