PostgreSQL 密码生成器
Posted
技术标签:
【中文标题】PostgreSQL 密码生成器【英文标题】:PostgreSQL password generator 【发布时间】:2016-09-19 14:15:03 【问题描述】:我需要一些关于 sql pass 生成器的帮助。我已经有一个返回 8 个随机字符的函数,但我必须确定,有小写和大写字符和数字。有什么建议吗?这是我的旧函数。
CREATE FUNCTION f_generate_password() RETURNS text AS $$
DECLARE
password text;
chars text;
BEGIN
password := '';
chars :=
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
FOR i IN 1..8 LOOP
password := password || SUBSTRING(chars,
ceil(random()*LENGTH(chars))::integer, 1);
END LOOP;
return password;
END;
$$
LANGUAGE plpgsql;
【问题讨论】:
【参考方案1】:如果您想知道算法...我不知道 PostgreSQL 语法/方言,但您可以例如:
1) 选择 3 个 random 位置(1 到 8)并在其中放置 3 个 random 小写字母 2) 选择 3 个 random 位置(从其余位置中)并在其中放置 3 个 random 大写字母 3) 将 2 个 random 数字放在其余两个位置。
【讨论】:
是的,我知道,我只是想要 SQL 语法中的那个 :) 但我已经做到了...我在这里粘贴代码只是为了帮助其他有同样问题的人 :)【参考方案2】:这里有一个相同或相似问题的解决方案:)
CREATE OR REPLACE FUNCTION f_generate_password()
RETURNS text AS
$BODY$
DECLARE
vPassword text;
chars text;
BEGIN
vPassword := '';
chars :=
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
WHILE((select COALESCE(substring(vPassword from '.*[a-z]+.*'),'')) = '' OR (select COALESCE(substring(vPassword from '.*[A-Z]+.*'),'')) = '' OR (select COALESCE(substring(vPassword from '.*[0-9]+.*'),'')) = '') LOOP
vPassword := '';
FOR i IN 1..8 LOOP
vPassword := vPassword || SUBSTRING(chars, ceil(random()*LENGTH(chars))::integer, 1);
END LOOP;
END LOOP;
return vPassword;
END;
$BODY$
LANGUAGE plpgsql;
【讨论】:
以上是关于PostgreSQL 密码生成器的主要内容,如果未能解决你的问题,请参考以下文章