Я понимаю, что в Postgres нет TRIGGER ON SELECT.Для такой таблицы
CREATE TABLE t (
a INTEGER PRIMARY KEY,
b TEXT,
entered_by INTEGER,
qry_count INTEGER
);
я хочу увеличивать "qry_count" для каждого SELECT для каждого "enter_by", по сути отслеживая, сколько раз запрашивается любая запись для каждого "входящего".Например,
SELECT * a, b FROM t WHERE <condition>;
может возвращать "n" строк, введенных разными участниками.Для каждого участника я хочу qry_count ++.Впереди псевдокод
FOR EVERY entered_by IN SELECT
UPDATE t
SET qry_count = qry_count + 1
WHERE entered_by = <entered_by>
Я мог бы сделать это проще всего в своем приложении, но мне интересно, может быть лучше сделать это в самой базе данных.Я нашел пример о том, куда, я думаю, я хочу пойти, но это для PL / SQL.Каков наилучший способ сделать это с помощью Pg?
Обновление: В Perl я бы сделал это так:
$sth_sel = $dbh->prepare( .. complicated SELECT includes "entered_by" ..);
$sth_upd = $dbh->prepare("UPDATE t SET qry_count = qry_count + 1 WHERE entered_by = ?");
$sth_sel->execute( .. bind params ..);
while (my $r = $sth_sel->fetchrow_arrayref) {
my $entered_by = $r->[ 7 ]; # or whatever
$sth_upd->execute($entered_by);
.. do other things with $sth_sel, perhaps build a JSON obj to return ..
}
Это кажется самым простым, но этобыло бы неплохо создать эту функциональность как основную часть схемы данных.
UPDATE2: Большинство примеров (включая приведенные ниже предложения) основаны на создании функции PL / PgSQL.Проблема этого подхода в том, что мой запрос жестко запрограммирован в функции.Даже если он может принимать входные параметры, это все равно предварительно объявленный запрос.Это означает, что я должен создать отдельную функцию для каждого запроса.На самом деле, в моем приложении я строю запросы динамически на основе того, что запрашивает пользователь (через Интернет).Запрошенные столбцы могут измениться, предоставленные параметры могут измениться.Я думаю, что я ищу SQL, аналогичный псевдокоду Perl выше, без предварительно объявленной функции (псевдокод SQL ниже)
BEGIN
FOR row IN
SELECT to my hearts content
FROM whatever tables I want JOINed horrendously
WHERE any arbitrary param
LOOP
eb := row[entered_by]
UPDATE t SET qry_count = qry_count + 1 WHERE entered_by = eb
RETURN NEXT row;
END LOOP;
RETURN;
END
Надеюсь, это прояснит мою цель.