2017-03-17 7 views
0

新しい作成ユーザーにロールのアクセス許可を与えることができるプロシージャを作成したいと思います。ユーザーがデータベースに作成された後、ユーザーがデータベース上に作成された直後にトリガーを使用してストアドプロシージャを実行します。

CREATE OR REPLACE PROCEDURE P_CREATE_USER 

BEGIN 
EXECUTE IMMEDIATE 'GRANT RESOURCE TO'||ora_dict_obj_name; 
EXECUTE IMMEDIATE 'GRANT CONNECT TO'||ora_dict_obj_name; 

END; 
/

はその後、私は、この手順を実行するトリガーを作成します。

私の考えは、私が最初にこのような手順を作成することでした。このように:

CREATE OR REPLACE TRIGGER T_CREATE_USER 
AFTER CREATE ON DATABASE 
WHEN (ora_dict_obj_type = 'USER') 

BEGIN 
    P_CREATE_USER; 
END; 
/

それは実際に動作しませんでした、あなたは他の提案を持っているのですか?

私はOracleをDBMSとして使用しています。

+0

これは[あなたの前の質問](http://stackoverflow.com/a/42837302/146325)あなたが受け入れて "それは働いた"と言った。今、あなたは「それは本当にうまくいかない」と言っています。だから、どうしたらうまくいかないのですか?追加の必要条件は何ですか? – APC

+0

あなたはDBAですか? XEで遊んでいるだけですか? – tbone

+0

@APCはい、あなたは正しいと言いました。私は「うまくいった」と言いましたが、追加の要件は、私が知る必要があることです。どのようにトリガーによって呼び出される手続きでそれを行うことができますか? –

答えて

0

問題はこれです:トリガーはORA-30511: invalid DDL operation in system triggersをスローします。

理由は、トリガーをコミットできないからです。 DDLは暗黙のコミットを発行します(ステートメントの前後)。あなたの引き金が働く方法はありませんし、これまで働くこともできませんでした。

トリガーでのコミットの回避策は、pragma AUTONOMOUS TRANSACTIONです。これにより、トリガーは独立したセッションで動作します。これは新しく作成されたユーザーが自律セッションでは表示されないため、ここにはありません。 SQL Serverで

CREATE OR REPLACE PROCEDURE P_CREATE_USER 
    (p_user_name in varchar2 
    , p_password in varchar2) 
is 
BEGIN 
    EXECUTE IMMEDIATE ' create user '||p_user_name ||' identified by '||p_password; 
    EXECUTE IMMEDIATE 'GRANT RESOURCE TO'||p_user_name ; 
    EXECUTE IMMEDIATE 'GRANT CONNECT TO'||p_user_name ; 

END; 
/
-2

ユーザー、新しく作成したユーザーにSQL権限を付与する手順を実行することができますような:あなたはロジックをカプセル化するために取得することができます

最善のアプローチはこれだろう。この作業を行うための条件は、あなたのアカウントのようなあなたのアカウントには、そのSQL許可に「許可あり」が必要なことです。

+2

'[sql]' tageは単にSQLの質問だけを参照しているので、 '[sql-server]'(または同様の)タグを持つMSSQLを意味するものではありません。この質問は '[oracle]'とタグ付けされています。したがって、SQL Serverで何が起きるのかは無関係です。それが起こるにつれ、オラクルはWITH GRANT機能も持っていますが、OPの実際の問題には関係していません。 SQL Serverについての質問にはたくさんの質問があります。それがあなたの専門分野ならば。がんばろう。 – APC

+0

説明をありがとう – coco

関連する問題