Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在日志文件中看到触发器函数_Sql_Postgresql_Database Trigger - Fatal编程技术网

Sql 如何在日志文件中看到触发器函数

Sql 如何在日志文件中看到触发器函数,sql,postgresql,database-trigger,Sql,Postgresql,Database Trigger,这张桌子上有个字谜我有个触发器 CREATE TRIGGER charassheattrigger BEFORE INSERT OR UPDATE ON public.charass FOR EACH ROW EXECUTE PROCEDURE public._charassheattrigger(); 此触发器执行的函数如下所示 CREATE OR REPLACE FUNCTION public._charassheattrigger() RETUR

这张桌子上有个字谜我有个触发器

CREATE TRIGGER charassheattrigger
    BEFORE INSERT OR UPDATE 
    ON public.charass
    FOR EACH ROW
    EXECUTE PROCEDURE public._charassheattrigger();
此触发器执行的函数如下所示

CREATE OR REPLACE FUNCTION public._charassheattrigger()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE
AS $BODY$

BEGIN

  IF (TG_OP = 'INSERT' OR (TG_OP = 'UPDATE' AND OLD.charass_value <> NEW.charass_value)) AND NEW.charass_char_id = 34 THEN
    IF NOT EXISTS(SELECT true FROM heat WHERE heat_number = NEW.charass_value) THEN
      INSERT INTO heat (heat_number,heat_created,heat_vend_id) 
        SELECT NEW.charass_value,NOW(), order_vend_id
        FROM ls
        JOIN detail ON (ls_id = detail_ls_id)
        JOIN hist ON (detail_hist_id = hist_id)
        JOIN order ON (hist_order_id = order_id)
        WHERE hist_ordtype = 'PO' AND hist_transtype = 'RP' AND ls_id = NEW.charass_target_id;
    END IF;
  END IF;  

  RETURN NEW;
END;
$BODY$;
当我查看日志文件时。我可以看到执行的语句

语句:插入charass\u值、charass\u目标类型、charass\u目标id、charass\u char\u id值“123456789”、“LS”、1234、34

我检查加热表,希望看到加热编号为“123456789”的记录,但加热表中没有任何内容

然后我打开pg admin,复制上面的语句并手动执行它。现在热量表中有一个记录

手动插入和应用程序执行的插入有什么区别。有办法告诉我吗?语句后面的用户名相同,因此不能是权限。我想知道是否有某种方法可以将信息从触发器函数发送到日志文件,以便我可以查看它

将自动解释添加到postgresql.conf中的共享预加载库以及这些附加参数:

auto_explain.log_nested_statements = on
auto_explain.log_min_duration = 0
然后重新启动PostgreSQL


现在,您将记录函数中的语句及其执行计划。

是否有任何可能导致此行为的因素?逻辑中的错误。查看这些语句肯定会有所帮助。似乎hist记录要到事务的后期才能创建。自动解释看起来不错,但我需要看看如何使它更精确。