1

プロシージャ内の User テーブルから ORACLE USER を作成しようとしています。問題は、特定の列を呼び出す方法がわからないことです。私は Camp.user.username などで試しました。

create or replace 
PROCEDURE PR_USERPASS AS
 BEGIN
  UPDATE CAMP.USERS
  SET USERNAME = (DBMS_RANDOM.string('x',15)), PASS = DBMS_RANDOM.string('x',12);
  EXECUTE IMMEDIATE 'CREATE USER ' || USERNAME || ' IDENTIFIED BY ' || PASSWORD;
  EXECUTE IMMEDIATE 'Grant connect to ' || USERNAME;
 END PR_USERPASS;

同じ手順でその参照を呼び出す方法はありますか? 前もって感謝します。

4

1 に答える 1

1

カーソルを使用してCamp.Usersテーブルをループし、その列にアクセスします。あなたのコードは次のようになります(テストされていません):

create or replace 
PROCEDURE PR_USERPASS AS
BEGIN
  UPDATE CAMP.USERS
  SET USERNAME = (DBMS_RANDOM.string('u',15)), PASS = DBMS_RANDOM.string('x',12);
  FOR userRow IN (SELECT Username, Pass FROM Camp.Users) LOOP
     EXECUTE IMMEDIATE 'CREATE USER ' || userRow.Username || ' IDENTIFIED BY ' || userRow.Pass;
     EXECUTE IMMEDIATE 'GRANT CONNECT TO ' || userRow.Username;
  END LOOP;
END PR_USERPASS;

補遺:USERNAMEとして生成された元の回答DBMS_Random.String('x', 15)では、ユーザー名とパスワードに数字と数字を使用できます。これにより、ユーザー名が数字で始まる場合に問題が発生しました。回答はDBMS_Random.String('u', 15)、Oracle が許容できるユーザー名の値のみを生成するために使用するように変更されました。パスワードは先頭の数字でOKのようでした。

数字で始まるユーザー名が必要な場合は、ユーザー名を二重引用符で囲みます。

     EXECUTE IMMEDIATE 'CREATE USER "' || userRow.Username || '" IDENTIFIED BY ' || userRow.Pass;
     EXECUTE IMMEDIATE 'GRANT CONNECT TO "' || userRow.Username || '"';

とはいえ、非標準のユーザー名を使用することがそれほど良い考えかどうかはわかりません。

のドキュメントは、ここDBMS_Random.Stringにあります。

于 2013-05-24T14:39:15.237 に答える