Используйте 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.
Скомпилированный, но не рабочий. «ИМЯ ПОЛЬЗОВАТЕЛЯ ИЛИ РОЛЬ ОЖИДАЕТСЯ» – Sergiodiaz53
Я пробовал с EXECUTE IMMEDIATE 'СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ (: a) ИДЕНТИФИЦИРОВАН (: b)' ИСПОЛЬЗОВАНИЕ userRow.USERNAME, userRow.PASS; И все еще не работает. – Sergiodiaz53
Ошибка 'ORA-01935'? В этом случае это, вероятно, потому, что 'DBMS_Random.String ('x', length)' возвращает значение с буквами и цифрами, а если первым символом является число, это недействительное имя для имени пользователя или пароля. Вы хотите иметь имена пользователей или пароли, начинающиеся с числа? В любом случае это хорошо; просто дайте мне знать, и я опубликую обновление. –