Oracleデータベースで特定のユーザーとIPの組み合わせをブロックするために、次のトリガーを作成し、エラーなしでコンパイルしました。
Create or replace trigger you_may_not_login
after logon on database
begin
if sys_context('USERENV','SESSION_USER')='xx' AND sys_context('USERENV','IP_ADDRESS')='10.0.30.219' then
raise_application_error(-20001,'Denied! You are not allowed to logon the database');
end if;
end;
/
「xx」ユーザーを使用してログインすると、アラートログに次のエラーが表示されますが、データベースにアクセスISが付与されているため、トリガーはユーザーのログインをブロックできません。
Errors in file /oraarch/core/udump/wfsbi_ora_9338.trc:
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: Sorry, you are not allowed here!
ORA-06512: at line 9
どこがいけないのですか?
SQLPlusでこれを確認することができます。それでも接続が解除されない場合は、トリガーの完了後に次のコマンドを実行して、想定を確認します。
SELECT 'Check This' FROM dual WHERE sys_context('USERENV','SESSION_USER') = 'xx';
SELECT 'Check This' FROM dual WHERE sys_context('USERENV','IP_ADDRESS') <> '10.0.30.219';
SELECT 'Check This' FROM user_role_privs WHERE granted_role='DBA';
SELECT 'Check This' FROM user_objects WHERE Object_Name='YOU_MAY_NOT_LOGIN' AND Object_Type='TRIGGER';
SELECT 'Check This' FROM User_sys_Privs WHERE Privilege='ADMINISTER DATABASE TRIGGER';
これらのいずれかがCheck This
を返す場合、想定の1つが正しくありません。
私にとって切断する必要があるのはRAISE_APPLICATION_ERROR
だけでしたが、 別のサイト はEXECUTE IMMEDIATE 'DISCONNECT';
も使用します。おそらくこれにより、DBAロールが付与されている場合でも機能します。私はそれを知るためにテストしていません。
また、クライアントが送信するIP_ADDRESSが変更される可能性があるため、これを安全なパスワードやその他の手段の代わりにセキュリティに使用しないでください。
この答え からServerFaultの同様の質問へ:
トリガーは、アクセスを拒否しません