1

我正在尝试从我的用户表在一个过程中创建一个 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;

附录:生成的原始答案USERNAMEDBMS_Random.String('x', 15),它允许用户名和密码的数字和数字。当用户名以数字开头时,这会引起麻烦。答案已更改为DBMS_Random.String('u', 15)仅用于生成 Oracle 可接受的用户名值。密码的前导数字似乎没问题。

如果需要以数字开头的用户名,只需用双引号将用户名括起来:

     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 回答