我试图为新用户生成随机密码,我有这样的查询:
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中使用它。 感谢
答案 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
。
您不应该以明文存储密码,您应该存储散列(和种子)版本。显然你需要知道明文告诉用户你是否正在生成它们,但你不应该像那样存储它们,你应该强迫用户立即更改它们。