在 informix 触发器中传递连接的字符串参数
Posted
技术标签:
【中文标题】在 informix 触发器中传递连接的字符串参数【英文标题】:Pass concatenated string parameter in informix trigger 【发布时间】:2013-07-18 08:13:53 【问题描述】:我有一个触发器,它将一些参数传递给一个过程并调用它。
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
【问题讨论】:
您没有以原始形式提供给您,即sp_ins("mytable", new.id, new.field1, new.field2, ...)
吗?为什么要连接它们?
我希望过程接受它作为 1 个参数,而不管表如何。例如,对于一张表,它只是一列id = new.id
。对于另一个表,它将是 2 列 - field1 = new.field1 and field2 = new.field2
。基本上我希望那个参数是一个 where 条件字符串。
【参考方案1】:
我的印象是生成某种共享审计或日志记录表。您显然需要在每个表的基础上定义 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。我忍不住想你最好去探索一下。
【讨论】:
是的,每个表都会有单独的触发器,它会传递不同数量的字段。所有触发器都会调用相同的过程。 我的回答是你想要的吗?请注意,如果 field1 或 field2 可以有效地为 NULL,您将遇到这种方法的问题。被警告... 字段值不能为空,因为它们是唯一索引的一部分 这就是我的观点——唯一约束仍然可以允许 NULL 值——你还需要有一个 NOT NULL 约束。 对于我的问题,您还有其他优雅的解决方案吗?我对每个表都有触发器,它们将调用一个过程,该过程将在一个元表中插入where clause
,该元表将唯一地标识该行。它不必是where clause
,而是任何用于唯一标识表中一行的信息,以便我以后可以检索它。以上是关于在 informix 触发器中传递连接的字符串参数的主要内容,如果未能解决你的问题,请参考以下文章
在 UPDATE 查询中使用 DateTime 或字符串参数时,Informix 11.7 返回 -1 作为受影响的行数