有没有办法在PostgreSQL查询中定义命名常量?例如:
MY_ID = 5;
SELECT * FROM users WHERE id = MY_ID;
Run Code Online (Sandbox Code Playgroud) 我正在使用PostgreSQL 9.1.我的数据库是结构化的,以便我的应用程序使用实际的表.对于每个表,都有历史表,仅存储更改历史记录.历史表包含相同的字段,实际表格和字段形成一些额外信息,例如.编辑时间.历史表仅由触发器处理.
我有两种触发器:
Before INSERT 触发器在创建表时向表添加一些额外信息(例如,create_time).Before UPDATE触发器和before DELETE触发器将旧值从实际表复制到历史表.问题是我想使用触发器来存储进行这些更改的用户的ID.而id我是来自php应用程序的id,而不是PostgreSQL用户id.
有没有合理的方法呢?
使用INSERT和UPDATE,可以只将id的额外字段添加到实际表中,并将用户id作为SQL查询的一部分传递给SQL.据我所知,这不适用于DELETE.
所有触发器的结构如下:
CREATE OR REPLACE FUNCTION before_delete_customer() RETURNS trigger AS $BODY$
BEGIN
INSERT INTO _customer (
edited_by,
edit_time,
field1,
field2,
...,
fieldN
) VALUES (
-1, // <- This should be user id.
NOW(),
OLD.field1,
OLD.field2,
...,
OLD.fieldN
);
RETURN OLD;
END; $BODY$
LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud) 我有以下MySQL脚本,我想在PostgreSQL中实现.
SET @statement = search_address_query;
PREPARE dynquery FROM @statement;
EXECUTE dynquery;
DEALLOCATE PREPARE dynquery;
Run Code Online (Sandbox Code Playgroud)
如何使用PostgreSQL定义用户定义的变量"@statement".
是否可以在查询期间设置可由 TRIGGER 过程捕获的变量(仅对相关查询有效)?
例如,我想记录查询执行者的ID(current_user始终相同)。所以我会做这样的事情:
tbl_executor (
id PRIMARY KEY,
name VARCHAR
);
tbl_log (
executor REFERENCE tbl_executor(id),
op VARCHAR
);
tbl_other ...
CREATE TRIGGER t AFTER INSERT OR UPDATE OR DELETE ON tbl_executor
FOR EACH ROW
EXECUTE PROCEDURE (INSERT INTO tbl_log VALUES( ID_VAR_OF_THIS_QUERY ,TG_OP))
Run Code Online (Sandbox Code Playgroud)
现在,如果我运行如下查询:
INSERT INTO tbl_other
VALUES(.......) - and set ID_VAR_OF_THIS_QUERY='id of executor' -
Run Code Online (Sandbox Code Playgroud)
我得到以下结果:
tbl_log
-----------------------------
id | op |
-----------------------------
'id of executor' | 'INSERT'|
Run Code Online (Sandbox Code Playgroud)
我希望我已经提出了这个想法...而且我认为这几乎不可行...但是有人可以帮助我吗?