use*_*081 3 postgresql json csv
数据通过准备好的语句和存储过程进入我的应用程序,所以我不太担心注入。当新用户注册时,我想发送一封激活电子邮件。目前我正在使用触发器和通知来执行此操作。它看起来像这样:
CREATE FUNCTION on_sign_up() RETURNS trigger as $$
DECLARE
BEGIN
PERFORM pg_notify('sign_ups', NEW.user_id || ',' || NEW.email || ',' || NEW.activation_code);
RETURN new;
END;
$$ language plpgsql;
CREATE TRIGGER on_sign_up_trigger AFTER INSERT ON user_account
FOR EACH ROW EXECUTE PROCEDURE on_sign_up();
Run Code Online (Sandbox Code Playgroud)
我的问题是通知有效负载。如果电子邮件包含逗号,那么我不能只在 ',' 上拆分字符串。我如何转义任何东西并将其放入有效载荷中?我可以添加我自己的自定义 CSV 转义函数并调用它,但是每当我认为这样的事情是正确的答案时,我通常会遗漏一些东西。
它不一定需要是 CSV,我只是认为这是最简单的。
注意:还有其他解决方案 - 例如去除“前缀”和“后缀”,然后将其余部分视为电子邮件。我对 PostgreSQL 本身内部的这种一般的清理/转义类更感兴趣。
我试图提取的表格如下:
Table "user_account"
Column | Type | Modifiers
-----------------+---------+----------------------------
user_id | integer | not null
email | citext | not null
password_hash | text | not null
activated | boolean | not null default false
activation_code | uuid | default uuid_generate_v4()
Run Code Online (Sandbox Code Playgroud)
而不是担心如何摆脱它。只需使用 JSON 作为传输层。这里我们使用row_to_json
CREATE FUNCTION on_sign_up() RETURNS trigger as $$
DECLARE
BEGIN
PERFORM pg_notify('sign_ups', row_to_json(NEW)::text );
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)