dbms_random字符串永远不会更改种子

时间:2014-06-30 11:54:47

标签: oracle random passwords

我试图为新用户生成随机密码,我有这样的查询:

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在第一次运行查询时会生成一个新的随机代码,但它会为INSERT的其余部分保留相同的种子。

如何使PLSQL在任何迭代中都能改变它?我从未在Oracle中使用它。 感谢

1 个答案:

答案 0 :(得分: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 demo of the difference

如果userID是主键,那么您不需要distinct

您不应该以明文存储密码,您应该存储散列(和种子)版本。显然你需要知道明文告诉用户你是否正在生成它们,但你不应该像那样存储它们,你应该强迫用户立即更改它们。