2016-07-14 7 views
-1

Oracle PL/SQLでデータベースリンクを使用する方法について質問があります。現在のデータベースで作成されたデータベースリンク(Database2)があり、それを使用して2番目のデータベースにアクセスしているとしましょう。例:Oracleデータベースがロールの付与/取り消しを行うリンク

select *from [email protected]; 

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

これらはすべて正常に動作します。

ただし、Database2のユーザーにロールを付与したり、ロールを取り消したいとします。それは私のデータベースリンクを通して行うことができますか?もしそうなら、構文は何ですか?私は、データベース2でPL/SQLセッションを開くと

することは、その後の構文は次のようになります。

REVOKE some_role FROM bsmith; 

GRANT some_other_role TO rjones; 

私のデータベース・リンクを使用して、私の元のデータベースからこれを実行する方法はありますか?

+0

データベース・リンクを介してDDLをしたいと思うのはなぜ?それは一般に許可されておらず、一般的には悪い考えです。データベースDDLに必要なDDLを実行するストアドプロシージャを作成し、データベースリンクユーザーにそのプロシージャに対する実行アクセス権を与えることができます。あるいは、実際には手間がかかり、データベース2上で実行されるジョブをスケジューリングすると、実際にはグラントを実行することができますが、それはかなり複雑なアーキテクチャです。 –

+0

私は、本番データベースからいくつかの特定のレコードとアクセス権を取得し、それらを開発用データベースまたはテスト用データベースにコピーするストアドプロシージャを作成しています。私はレコードを問題なくコピーすることができますが、パーミッションを付与することはもっと難解です。 – MrMike

答えて

0

リモート・データベース上のDBMS_SQLパッケージを呼び出すことにより、DBリンク経由でDDL操作を行うことができます。

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年前にそれを使って薄暗く思い出しました)。 –

関連する問題