在 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'MalleySylvester "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 触发器中传递连接的字符串参数的主要内容,如果未能解决你的问题,请参考以下文章

Informix 外部表传递文件名作为参数

在 UPDATE 查询中使用 DateTime 或字符串参数时,Informix 11.7 返回 -1 作为受影响的行数

Informix 连接字符串字段描述和要使用的值

使用 BIDS 从带有参数的 Informix ODBC 源中提取数据

如何在informix中创建触发器?

Informix 中插入触发器的自引用更新