2013-05-24 2 views
1

Я пытаюсь создать ORACLE USER из таблицы 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; 

Можно ли назвать это ссылкой в ​​той же процедуре? Спасибо заранее.

ответ

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.

+0

Скомпилированный, но не рабочий. «ИМЯ ПОЛЬЗОВАТЕЛЯ ИЛИ РОЛЬ ОЖИДАЕТСЯ» – Sergiodiaz53

+0

Я пробовал с EXECUTE IMMEDIATE 'СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ (: a) ИДЕНТИФИЦИРОВАН (: b)' ИСПОЛЬЗОВАНИЕ userRow.USERNAME, userRow.PASS; И все еще не работает. – Sergiodiaz53

+0

Ошибка 'ORA-01935'? В этом случае это, вероятно, потому, что 'DBMS_Random.String ('x', length)' возвращает значение с буквами и цифрами, а если первым символом является число, это недействительное имя для имени пользователя или пароля. Вы хотите иметь имена пользователей или пароли, начинающиеся с числа? В любом случае это хорошо; просто дайте мне знать, и я опубликую обновление. –