строка dbms_random, никогда не изменяющая начальное значение

#oracle #random #passwords

#Oracle #Случайный #пароли

Вопрос:

Я пытаюсь сгенерировать случайные пароли для новых пользователей, и у меня есть такой запрос:

 INSERT INTO LOGIN t (t.userID, t.password)
SELECT DISTINCT u.userID, (select dbms_random.string('U', 10) str from dual)
FROM USERS u
where u.userID IS NOT NULL
  

Но проблема в том, что dbms_random.string генерирует новый случайный код при первом запуске запроса, но сохраняет то же начальное значение для остальной части вставки.

Как я могу заставить PLSQL изменять ее на любой итерации? Я никогда не использовал его в Oracle. Спасибо

Ответ №1:

Подзапрос

 (select dbms_random.string('U', 10) str from dual)
  

будет выполняться только один раз, при этом одно и то же значение будет доступно для каждой вставленной строки. Однако вам не нужен подзапрос:

 INSERT INTO LOGIN t (t.userID, t.password)
SELECT DISTINCT u.userID, dbms_random.string('U', 10)
FROM USERS u
where u.userID IS NOT NULL
  

Демонстрация разницы в SQL Fiddle.

Если userID это первичный ключ, то он вам не нужен distinct .

Вы не должны хранить пароли в виде открытого текста, вы должны хранить хэшированную (и заполненную) версию. Очевидно, вам нужно знать открытый текст, чтобы сообщить пользователям, генерируете ли вы их, но вы не должны хранить их таким образом, и вы должны заставлять пользователей изменять их немедленно.