【发布时间】:2016-05-06 04:44:57
【问题描述】:
我有这些表:
CREATE EXTENSION citext;
CREATE EXTENSION "uuid-ossp";
CREATE TABLE cities
(
city_id serial PRIMARY KEY,
city_name citext NOT NULL UNIQUE
);
INSERT INTO cities(city_name) VALUES
('New York'), ('Paris'), ('Madrid');
CREATE TABLE etags
(
etag_name varchar(128) PRIMARY KEY,
etag_value uuid
);
INSERT INTO etags(etag_name, etag_value)
VALUES ('cities', uuid_generate_v4());
我想在城市表更改时更新城市 etag。如果insert、update或delete语句不影响任何行,我想避免更改城市etag,所以我编写了以下语句级触发器:
CREATE OR REPLACE FUNCTION update_etag()
RETURNS trigger AS
$BODY$
DECLARE
record_count integer;
vetag_name varchar(128);
BEGIN
GET DIAGNOSTICS record_count = ROW_COUNT;
vetag_name := TG_ARGV[0];
RAISE NOTICE 'affected %:%', vetag_name, record_count;
IF record_count = 0 THEN
RETURN NULL;
END IF;
UPDATE etags SET etag_value = uuid_generate_v4()
WHERE etag_name = vetag_name;
RETURN null;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
CREATE TRIGGER update_cities_etag_trigger
AFTER INSERT OR UPDATE OR DELETE
ON cities
FOR EACH STATEMENT
EXECUTE PROCEDURE update_etag('cities');
但是GET DIAGNOSTICS record_count = ROW_COUNT; 对我不起作用,因为它总是返回 0。
如果我执行以下操作:
DELETE FROM cities;
以下是输出:
注意:受影响的城市:0 查询成功返回:3 行 受影响,47 毫秒的执行时间。
有没有办法确定在 PostgreSQL 语句级触发器中触发触发器的语句影响了多少行?
【问题讨论】:
标签: postgresql triggers