概要
ユーザにalter system権限を渡さずにkillする仕組みを作成する。
詳細
ユーザにalter system権限を渡さずにkillするプロシージャのサンプル。 具体的には、alter system権限を持つユーザにセッションをkillするプロシージャを作成し、そのプロシージャの実行権限のみ渡しalter system権限を持たないユーザがセッションの切断を可能とする。
前提及びポイント
- プロシージャの所有者はTESTユーザとする
- TEST2ユーザにプロシージャの実行権限のみ付与する。alter system権限は付与しない
- AUTHID DEFINER指定によりプロシージャ実行時の権限はプロシージャを所有するユーザ(TEST)の権限で動くようにする。TESTユーザはALTER SYSTEMやV$SESSIONの実行権限を持つようにする
- プロシージャを実行するとTEST2ユーザでログインしているセッションをすべてkill sessionする
プログラム
--権限付与
sqlplus /@pdb1 as sysdba
create user TEST identified by test;
create user TEST2 identified by test;
GRANT dba to TEST;
GRANT connect to TEST2;
GRANT alter system to TEST;
GRANT SELECT ON SYS.V_$SESSION TO TEST;
--プロシージャ作成
sqlplus TEST/test@pdb1
CREATE OR REPLACE PROCEDURE TEST.KILL_TEST2_SESSIONS
AUTHID DEFINER
AS
CURSOR session_cursor IS
SELECT sid, serial#
FROM v$session
WHERE username = 'TEST2';
BEGIN
FOR rec IN session_cursor LOOP
BEGIN
EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION ''' || rec.sid || ',' || rec.serial# || ''' IMMEDIATE';
DBMS_OUTPUT.PUT_LINE('セッション SID: ' || rec.sid || ', シリアル#: ' || rec.serial# || ' を強制終了しました。');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('セッション SID: ' || rec.sid || ', シリアル#: ' || rec.serial# || ' の強制終了に失敗しました。エラー: ' || SQLERRM);
END;
END LOOP;
COMMIT;
END;
/
grant execute on TEST.KILL_TEST2_SESSIONS to test2;
-- 実行
sqlplus TEST2/test@pdb1
SET SERVEROUTPUT ON;
exec TEST.KILL_TEST2_SESSIONS;