1

期限切れのユーザー アカウントが多数ある Oracle 11gR2 データベースを考えてみましょう。パスワードを変更せずに、すべてのユーザー アカウントを再度有効にしたいと考えています。

ALTER USERアカウントを再度有効にするために実行できる SQL ステートメントの文字列を作成する SQL ステートメントを次に示します。

select listagg( cmds, ' ' ) within group ( order by rownum )
    as cmd
from (
    select
        'alter user "' || d.username || '"' ||
            ' identified by values ''' || u.password || '''' ||
            ' account unlock;'
    as
        cmds
    from
        dba_users d, sys.user$ u
    where
        d.user_id = u.user#
);

このクエリの結果は、次のようなエントリを含む文字列です。

alter user "USERNAME" identified by values '1234567890ABCDEF' account unlock; ...

このクエリの結果を変数に格納してから呼び出す PL/SQL プロシージャを作成できると確信していますが、EXECUTE IMMEDIATE [var]SQL 構文マジックを使用して、ステートメントEXECUTE IMMEDATEによって作成された文字列を単純に実行することは可能ですか?SELECT

4

2 に答える 2

2

ストアド プロシージャは必要ありません。匿名の PL/SQL ブロックを使用できます。

DECLARE
   stmt varchar(5000);
   cursor get_users
   is
    select d.username, u.password
    from dba_users d
        join sys.user$ u d.user_id = u.user#
    where lock_date is not null;
   user_rec get_users%rowtype;

BEGIN
    FOR user_rec in get_users loop
    BEGIN
       stmt := 'alter user "' || user_rec.username || '"' ||
               ' identified by values ''' || user_rec.password || '''' || 
               ' account unlock';
       execute immediate stmt;
     EXCEPTION WHEN others THEN
        dbms_output.put_line('Error unlocking '||user_rec.username);
        dbms_output.put_line(SQLERRM);
     END;
   END LOOP;
END;
/
于 2013-03-04T23:40:02.790 に答える
1

このようなSQL生成SQLは機能しますが、ニーズに合っているかどうかはわかりません:

sqlplus -s user/pw@db
set heading off
set feedback off 
set pages 0
spool cmd.sql
select ...
spool off
@cmd.sql
于 2013-03-04T23:01:41.997 に答える