【发布时间】:2016-02-03 03:19:37
【问题描述】:
CREATE TABLE accounts (
id SERIAL PRIMARY KEY,
email TEXT,
verified BOOLEAN DEFAULT FALSE,
...
);
CREATE OR REPLACE FUNCTION fn_reset_verified() RETURNS TRIGGER AS $$
BEGIN
IF (
OLD.email != NEW.email -- do nothing if no change
) THEN
RAISE NOTICE 'UPDATE';
UPDATE users SET verified=FALSE WHERE id=NEW.id;
END IF;
RETURN NEW;
END; $$ language 'plpgsql';
CREATE TRIGGER reset_verified AFTER UPDATE OF email ON accounts
FOR EACH ROW
WHEN (OLD.email != NEW.email) -- only when email changed
EXECUTE PROCEDURE fn_reset_verified();
基于上述架构,如果用户更改电子邮件,我希望创建自动更新验证为 false 的触发器。 它适用于以下语句:
UPDATE accounts SET email='newemail@email.com' WHERE id=1;
当我打算更新电子邮件并同时将验证设置为 TRUE 时,我的问题出现了,如下所示:
UPDATE accounts SET email='verified@email.com', verified=TRUE WHERE id=1;
如果在更新语句中设置了验证,我应该跳过该功能。也许条件如下:
WHEN (OLD.email != NEW.email AND STATEMENT.verified IS NULL)
那么有什么方法可以获得更新声明或涉及的列吗?
【问题讨论】:
标签: postgresql triggers