Программирование >>  Oracle 

1 ... 373 374 375 [ 376 ] 377 378 379 ... 469


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-процедура с правами создателя:



1 ... 373 374 375 [ 376 ] 377 378 379 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.002
При копировании материалов приветствуются ссылки.
Яндекс.Метрика