我有包含这些(和其他)列的表票:
- ID
- ticket_type
- 客户
如果ticket_type
或client
得到更新,那么表格transfere_table
应该被归档。已更改机票的 ticket.id 应插入到转账表中。
这是工作代码:
CREATE FUNCTION add_ticket_to_transfere_table () RETURNS trigger
LANGUAGE plpythonu AS $$
plpy.execute(plpy.prepare(
'''INSERT INTO transfere_table (ticket_id) VALUES ($1)''',
['int']), [TD['new']['id']])
$$;
CREATE TRIGGER add_ticket_to_transfere_table_trigger
AFTER UPDATE OF ticket_type_id, client_id ON ticket
FOR EACH ROW
WHEN (OLD.ticket_type_id != NEW.ticket_type_id or
OLD.client_id != NEW.client_id)
EXECUTE PROCEDURE add_ticket_to_transfere_table();
由于我到现在只用过plpythonu,所以就这样解决了。它有效,但我看到有两点需要改进:
- 去掉 FOR EACH ROW: 如果 N 行被更新,如果只执行一个 INSERT 就好了
- 不要使用 plpythonu
如何实现这些改进?
还有其他可以改进的地方吗?
我正在使用 PostgreSQL 9.3.13
那将如何工作,您将无法访问 OLD 或 NEW,因为它是一个语句触发器。
Python 本身不支持作为可信语言运行。您可以轻松使用
plpgsql
.plpgsql 函数的代码,
这不是我个人运行它的方式。我会做的是
triaged
在代表的行或任何transfere_table
代表的行上创建一个布尔值。如果你不想碰那个桌子本身,我会反向运行你的过程。
创建表
transfere_done
将所有 ID 复制到它。
创建以下视图,
现在,当您插入时
ticket
,它会自动显示在下方,transfere_queue
直到您插入到transfere_done
。您可能想要也可能不想MATERIALIZE
查看。无论哪种方式,我都非常讨厌在不需要时使用触发器,并且我尝试围绕它们进行设计。