我很想在程序中的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;
无论如何都要在同一程序中调用这些引用? 提前谢谢。
答案 0 :(得分:1)
使用cursor遍历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可接受的用户名值。密码似乎没有前导数字。
如果需要以数字开头的用户名,只需用双引号括起用户名:
EXECUTE IMMEDIATE 'CREATE USER "' || userRow.Username || '" IDENTIFIED BY ' || userRow.Pass;
EXECUTE IMMEDIATE 'GRANT CONNECT TO "' || userRow.Username || '"';
那就是说,我不确定是否有非标准的用户名是个好主意。
可以找到DBMS_Random.String
的文档here。