|
Программирование >> Oracle
1550 Глава 23 sys context(userenv,current schema) + FROM T ; Statement stmt = cnx.createStatement(); ResultSet rset = stmt.executeQuery(sql); if (rset.nextO) System.out.println( rset.getString(l) + session user= + rset.getString(2)+ current user= + rset.getString(3)+ current schema= + rset.getString(4)); rset.close(); stmt.close() ; tkyte@TKYTE816> host dropjava -user tkyte/tkyte ir java.java tkyte@TKYTE816> host loadjava -user tkyte/tkyte -synonym -grant u1 - verbose -resolve ir java.java initialization complete loading : ir java creating : ir java resolver : resolving: ir java synonym : ir java Представленная выше подпрограмма загружается с правами вызывающего. Теперь загрузим ту же подпрограмму с другим именем. При загрузке подпрограммы с помощью loadjava укажем, что она должна выполняться с правами создателя: tkyte@TKYTE816> host type dr java.java import java.sql.*; import oracle.jdbc.driver.*; public class dr java ... тот же код, что и в предыздущем примере ... } tkyte@TKYTE816> host dropjava -user tkyte/tkyte dr java.java tkyte@TKYTE816> host loadjava -user tkyte/tkyte -synonym -definer -grant u1 -verbose -resolve dr jav initialization complete loading : dr java creating : dr java resolver : resolving: dr java synonym : dr java Итак, отличия между IR JAVA и DR JAVA - имена классов и тот факт, что подпрограмма DR JAVA была загружена с опцией -definer. Затем я создал спецификацию вызова PL/SQL, чтобы можно б1ло выполнять эти процедуры из SQL*Plus. Обратите внимание, что создано четыре версии. Все вызовы хранимых процедур на Java выполняются только через SQL-уровень. Поскольку SQL-ypo- Права вызывающего и создателя 1551 вень, фактически, представляет собой интерфейсную PL/SQL-подпрограмму, в ней тоже можно задавать конструкцию AUTHID. Надо разобраться, что происходит, когда из подпрограммы с правами вызывающего/создателя на уровне PL/SQL вызывается Java-процедура с правами вызывающего/создателя: tkyte@TKYTE816> create OR replace procedure ir ir java 2 authid current user 3 as language java name ir java.test(); Procedure created. tkyte@TKYTE816> grant execute on ir ir java to u1; Grant succeeded. tkyte0TKYTE816> create OR replace procedure dr ir java 2 as language java name ir java.test(); Procedure created. tkyte@TKYTE816> grant execute on dr ir java to u1; Grant succeeded. tkyte@TKYTE816> create OR replace procedure ir dr java 2 authid current user 3 as language java name dr java.test(); Procedure created. tkyte@TKYTE816> grant execute on ir dr java to u1; Grant succeeded. tkyte@TKYTE816> create OR replace procedure dr dr java 2 authid current user 3 as language java name dr java.test(); Procedure created. tkyte@TKYTE816> grant execute on dr dr java to u1; Grant succeeded. Теперь необходимо создать и наполнить данными таблиц T в схеме TKYTE : tkyte@TKYTE816> drop table t; Table dropped. tkyte@TKYTE816> create table t (msg varchar2(50)); Table created. tkyte@TKYTE816> insert into t values (со таблица Т, принадлежащая -> пользователю user); 1 row created. Итак, теперь мы готовы к проверке выполнения от имени пользователя U1, у которого сейчас появится таблица T со строкой, тоже идентифицирующей владельца: 1552 Глава 23 tkyte@TKYTE816> ©connect ul/pw ul@TKYTE816>drop table t; Table dropped. ul@TKYTE816> create table t (msg varchar2(50)); Table created. ul@TKYTE816>insert into t values (Это таблица Т, принадлежащая -> пользователю user); 1 row created. ul@TKYTE816>set serveroutput on size 1000000 ul@TKYTE816> exec dbms java.set output(1000000) ; PL/SQL procedure successfully completed. ul@TKYTE816>exec tkyte.ir ir java Это таблица Т, принадлежащая пользователю U1 session user=U1 current user=U1 current schema=U1 PL/SQL procedure successfully completed. Это показывает, что, когда хранимая Java-процедура с правами вызывающего в1-вается из PL/SQL-процедуры с правами вызывающего, она работает как процедура с правами вызывающего. Текущий пользователь и текущая схема - U1, SQL-оператор в хранимой Java-процедуре, обращается к таблице U1.T, а не TKYTE.T. Теперь давайте вызовем тот же Java-код из процедуры с правами создателя: ul@TKYTE816> exec tkyte.dr ir java Это таблица Т, принадлежащая пользователю TKYTE session user=U1 current user=TKYTE current schema=TKYTE PL/SQL procedure successfully completed. Теперь, хотя хранимая Java-процедура загружена с правами вызывающего, она работает как процедура с правами создателя. Это вполне можно было предвидеть исходя из того предыдущих примеров. Процедура с правам вызывающего, вызываемая из процедуры с правами создателя, работает аналогично процедуре с правами создателя. Роли не учитываются; текущая схема фиксируется статически, как и текущий пользователь. Эта процедура обращается к таблице TKYTE.T, а не к Ul.T, как в предыдущем примере, а текущий пользователь и схема имеет фиксированное значение - TKYTE. Давайте рассмотрим, что произойдет, если PL/SQL-процедура с правами выз1ваю-щего вызывает хранимую Java-процедуру, загруженную с правами создателя: ul@TKYTE816> exec tkyte.ir dr java Это таблица Т, принадлежащая пользователю TKYTE session user=U1 current user=TKYTE current schema =TKYTE PL/SQL procedure successfully completed. Это показывает, что если Java-процедура загружена с опцией -definer, она работает с правами создателя, даже если вызывается из процедуры с правами вызывающего. Результат последнего примера теперь уже очевиден. Из PL/SQL-процедуры с правами создателя вызывается Java-процедура с правами создателя:
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.002
При копировании материалов приветствуются ссылки. |