Veja o código abaixo. Estou executando o código com o usuário x no esquema y. O mesmo código funciona se eu executá-lo pelo usuário x no esquema x, mas não com o usuário x no esquema y. Eu recebo o erro ORA-06512: table or view does not exist
. Por que isso seria? Estou definindo o esquema explicitamente como y. Ao executar APENAS a instrução create com o usuário x no esquema y, ela funciona bem. E ao executar APENAS a instrução create com o usuário x no esquema x, ela também funciona bem.
Existem dois sinônimos no esquema y, chamados aaaaa e bbbbb. Consulte y.aaaaaa e y.bbbbb na instrução create. Sinônimo y.aaaaa seleciona dados da tabela z.aaaaa no esquema z. Sinônimo y.bbbbb seleciona dados da tabela z.bbbbb no esquema z. o usuário x atualmente tem permissões SELECT nessas duas tabelas no esquema z. Renomeei os sinônimos (y.aaaaa e y.bbbbb) no esquema y para que sejam mais fáceis de encontrar.
O XSQL é o culpado, mas não tenho certeza de quais permissões precisamos. Quando XSQL(sql_code)
é comentado, não gera o erro.
Isso não funciona:
alterar conjunto de sessão current_schema=y;
DECLARE sql_code VARCHAR2(4000) :=
'create table basis as '||
'(select my_basecode,c_fullname,encounter_num,concept_cd from aaaaa basis '||
' inner join enc on enc.patid = basis.patient_num and enc.encounterid = basis.encounter_num '||
' join bbbbb basiscode '||
' on basis.modifier_cd = basiscode.c_basecode '||
' and basiscode.c_fullname like ''\BASIS\%'') ';
BEGIN
DROPSQL('DROP TABLE basis');
XSQL(sql_code);
END;
Isso funciona:
alter session set current_schema=y;
create table basis as
(select my_basecode,c_fullname,encounter_num,concept_cd from aaaaa basis
inner join enc on enc.patid = basis.patient_num and enc.encounterid = basis.encounter_num
join bbbbb basiscode
on basis.modifier_cd = basiscode.c_basecode '||
and basiscode.c_fullname like '\BASIS\%');
Para fins de referência:
create or replace PROCEDURE XSQL(sqlstring VARCHAR2) AS
BEGIN
EXECUTE IMMEDIATE sqlstring;
dbms_output.put_line(sqlstring);
END XSQL;
Bem, simulei seu problema em meu ambiente de teste. Encontrei o problema com o nome da tabela (
aaaa
ebbbbb
que pertence aoz
esquema).Embora você tenha privilégio de seleção nessas tabelas, você deve usar o nome do esquema explicitamente (
z.aaaaa
ez.bbbbb
). O seguinte é o caso de teste.