我有一个触发器,它将一些参数传递给一个过程并调用它。
CREATE TRIGGER trig_ins INSERT ON mytable
REFERENCING NEW AS new
FOR EACH ROW(EXECUTE PROCEDURE sp_ins("mytable", new.id, 'I'));
有什么方法可以将连接的char作为第二个参数传递给上面的过程调用?
我需要这个,因为我可能需要允许这些参数:
"id = " . new.id
"field1 =" . new.field1 . "and field2 = " . new.field2
答案 0 :(得分:2)
我得到的印象是生成某种共享审计或日志记录表。您显然需要在每个表的基础上定义TRIGGER
,因此在每个声明中,您可以指定相关字段,例如
CREATE TRIGGER trig_ins INSERT ON mytable
REFERENCING NEW AS new
FOR EACH ROW(EXECUTE PROCEDURE sp_ins("mytable",
"field1 = " || new.field1 || " and field2 = " || new.field2, 'I'));
但它看起来有点笨拙。我不禁想到这是某种XY problem。
<强>更新强>
(评论'不必where_clause
')
嗯,显而易见的答案是确保每个表都有一个简单的单个代理键列,可以像ROWID一样对待。
当然,当你拥有一个现有的模型时,说起来容易做起来难。如果那是不可能的,那么你想要的是以一种可以在以后需要时解析的方式表示你的复合键。具体如何做到这一点取决于你打算如何解析它:编程或通过你最初提出的预构建的SQL片段。前者更易控制,但不会产生“可注入的”SQL片段:
EXECUTE PROCEDURE sp_ins("mytable",
"<field1>" || NVL(new.field1,"") || "</field1>" ||
"<field2>" || NVL(new.field2,"") || "</field2>",
"I");
...是这样做的一种方式。您可以执行SQL片段方法,它只是构造非常混乱,如上所示。例如,如果field1是一个字符串,那么SQL已经坏了,您需要执行以下操作:
EXECUTE PROCEDURE sp_ins("mytable",
"field1 " || NVL('= "'||new.field1||'"','IS NULL') || ' AND ' ||
"field2 " || NVL('= "'||new.field2||'"','IS NULL'),
"I")
...而且您可以确定迟早会遇到爱尔兰问题,例如O'Malley
或Sylvester "Sly" Stallone
等名称会破坏这些嵌入式引号。没有优雅的解决方案,因为这是你想要做的不优雅的事情。
Informix提供out-of-the-box audit features和ways and means of exploring the logical logs。我不禁想到你最好去探索那些。