До Oracle Database 12c, если в тексте запроса или анонимного PL/SQL-блока в имени объекта не была явна указана схема, то будет использована текущая схема.
Для программных единиц PL/SQL (пакетов, процедур, функций и т.д.) созданных с правами создателя, это будет схема в которой происходила компиляция, для созданных с правами вызывающего - схема пользователя, под которым происходит вызов динамического SQL.
Начиная с Oracle Database 12c, можно четко контролировать схему в имени объекта, для которых она была не указана в динамическом SQL:
[oracle@rac1 ~]$ sqlplus rscott/rtiger
SQL*Plus: Release 12.1.0.2.0 Production on Fri Jan 9 16:24:34 2015
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management options
SQL> create or replace package body account_service as
procedure deleteAccount(v_pId in number) is
v_xCursor integer;
v_xRowCount integer;
v_xPLSQL_Str varchar2(1600);
begin
v_xPLSQL_Str := 'delete from accounts where id = :v_pId';
v_xCursor := dbms_sql.open_cursor;
dbms_sql.parse(c => v_xCursor,
statement => v_xPLSQL_Str,
language_flag => DBMS_SQL.NATIVE,
schema => 'DATA_OWNER');
dbms_sql.bind_variable(v_xCursor, ':v_pId', v_pId);
v_xRowCount := dbms_sql.execute(c => v_xCursor);
dbms_sql.close_cursor(c => v_xCursor);
end;
end;
/
Package body created.
Важно отметить, что параметр SCHEMA в процедуре PARSE отвечает лишь за имя схемы, в которой происходит поиск объекта при парсинге. Выполнение динамического SQL происходит с правами той программной единицы PL/SQL, в которой происходит вызов пакета DBMS_SQL - с правами создателя, либо с правами вызывающего.
Комментариев нет:
Отправить комментарий