2016-07-14 6 views
-1

У меня возник вопрос о том, как использовать ссылки базы данных в Oracle PL/SQL. Предположим, у меня есть ссылка на базу данных (Database2), созданная в моей текущей базе данных, и я использую ее для доступа ко второй базе данных. Например:Ссылки на базы данных Oracle для ролей предоставления/отзыва

select *from [email protected]; 

Update [email protected] 
set Comment = 'Hello world!' 
where CustomerID = 123; 

Все эти работы успешно работают.

Но предположим, что я хочу предоставлять роли или отменять роли от пользователя в Database2. Это можно сделать через ссылку на мою базу данных? Если да, то какой синтаксис?

Если я открываю/SQL сессии PL в database2, то синтаксис будет:

REVOKE some_role FROM bsmith; 

GRANT some_other_role TO rjones; 

Есть ли способ сделать это с моей исходной базы данных, используя мою ссылку базы данных?

+0

Почему вы хотите сделать DDL по ссылке базы данных? Это вообще не допускается и, как правило, плохая идея. Вы можете создать хранимую процедуру в базе данных2, которая делает любой DDL-файл, а затем предоставить пользователю доступ к ссылке на базу данных для этой процедуры. Или вы можете получить очень сложную задачу и запланировать работу, которая будет выполняться в базе данных2, которая фактически будет предоставлять гранты, но это довольно сложная архитектура. –

+0

Я пишу хранимую процедуру, которая возьмет некоторые конкретные записи и разрешения из моей производственной базы данных и скопирует их в мою базу данных разработки или тестирования. Я могу копировать записи без проблем, но предоставление разрешений оказывается намного сложнее. – MrMike

ответ

0

Вы можете сделать DDL над Link DB путем вызова пакета DBMS_SQL на удаленной базе данных:

declare 
v_cursor NUMBER; 
v_ind  number; 
v_ret  varchar2(2000); 
BEGIN 
    v_cursor := [email protected]; 
    [email protected](v_cursor, 'create sequence xyz_seq', dbms_sql.native); 
    v_ind := [email protected](v_cursor); 
end; 
/
+0

Хорошая идея. Спасибо, Гэри. – MrMike

+0

Или '[email protected]()' может быть проще (непроверено, но я смутно вспоминаю, что 20 лет назад). –