在视图上创建触发器

时间:2014-11-27 12:07:47

标签: sql postgresql postgresql-9.1

我有一个使用now()函数的时间相关视图,因此会随着时间的推移而改变值。

以下简单代码:

DROP VIEW IF EXISTS av;
DROP TABLE IF EXISTS A;
CREATE TABLE A (when_epoch_seconds INTEGER, x VARCHAR);

INSERT INTO A(when_epoch_seconds, x) SELECT CAST (EXTRACT (epoch FROM now()) AS INT), 'x';

CREATE VIEW av AS
WITH cte AS
(SELECT MAX(when_epoch_seconds) AS latestEntry FROM a)
SELECT CAST (EXTRACT (epoch FROM now()) AS INT) - cte.latestEntry > 5 AS too_old FROM cte;

SELECT too_old FROM av;

我的问题是如何创建一个持续监视视图too_old中列av的值的触发器,例如,每当该值从true翻转时在“notification”表中插入一行是假的,反之亦然?或者是否有其他机制更适合实现相同的效果?

1 个答案:

答案 0 :(得分:1)

view是一个“虚拟”表,意味着它反映了存储在一个或多个表中的值。 trigger是在表上发生特定事件(INSERT,DELETE等)时执行的一组指令。

  

如何创建一个持续监控其值的触发器   在视图av中列too_old

您无法创建与视图相关的触发器。视图不会“更改”值,表格也是如此。视图只是存储在引用表中的记录的结果集。 编辑:您实际上可以创建一个视图(正如@ MikeSherrill'CatRecall'所说的那样),in PostgreSQL 9.1。这是引擎最新版本中引入的功能。即使您可以在视图上创建触发器,我认为最正确的方法是在基表上创建它。我实际上并没有看到在视图上创建它的重点。

它不存在始终执行的触发器,侦听引用表的更改。如果它存在,则连续运行的触发器将极大地影响SQL引擎的性能,使得SQL引擎运行缓慢且运行查询的速度极慢。我认为,这就是为什么不存在这种事情的主要原因。

PostgreSQL引擎有一个很好的功能,可以帮助你,倾听变化,名为LISTEN