我将您的查询稍微修改为(a)tb.datakey
在选择列表中包含,并且(b)省略条件tabid
(因此它会为任何表选择任何触发器):
SELECT tr.tabid, tr.trigid, tr.trigname, tr.owner, tb.datakey, tb.data
FROM systriggers tr, systrigbody tb
WHERE {tr.tabid = ?}
{AND} tr.trigid = tb.trigid
AND tb.datakey != 'B' AND tb.datakey != 'H'AND tb.datakey !='S'
ORDER BY tb.datakey DESC;
我在一个装有触发器的数据库上运行它,部分输出是:
124|49|u_timerecord|wtsdba|D|create trigger "wtsdba".u_timerecord update on "wtsdba".timerecord
124|50|d_timerecord|wtsdba|D|create trigger "wtsdba".d_timerecord delete on "wtsdba".timerecord
125|51|u_wi_buglist|wtsdba|D|create trigger "wtsdba".u_wi_buglist update on "wtsdba".wi_buglist
127|52|u_wi_problem|wtsdba|D|create trigger "wtsdba".u_wi_problem update on "wtsdba".wi_problem
128|53|u_wi_task|wtsdba|D|create trigger "wtsdba".u_wi_task update on "wtsdba".wi_task
106|15|d_workstate|wtsdba|A| before\ (\ execute procedure "jleffler".wtsdba_del('WorkState' ));
106|14|u_workstate|wtsdba|A| before\ (\ execute procedure "jleffler".wtsdba_upd('WorkState' ));
114|29|u_sec_action|wtsdba|A| before\ (\ execute procedure "jleffler".wtsdba_upd('SEC_Action' ));
107|16|d_workitem|wtsdba|A| before\ (\ execute procedure "jleffler".wtsdba_del('WorkItem' ));
115|30|u_wts_menu|wtsdba|A| before\ (\ execute procedure "jleffler".wtsdba_upd('WTS_Menu' ));
我修改了输出,以便将多个空白替换为单个空白。总共有110行;我只是从列表中间选择了几个,其中数据键从'D'
变为'A'
。
这是在类似的 DB-Access 工作中运行的;使用 DB-Access,您将获得基本相同的结果,但格式会更加冗长。
由此,我推断您的查询基本上是合理的。我并不否认你看到了奇怪的结果。因此,您需要生成一个最小的测试用例——一个简单的 Java 和 JDBC 程序,它执行显示的查询或您的原始查询,并演示问题(一个 SSCCE — <a href="http://sscce.org/ " rel="nofollow">简短的、独立的、正确的例子——换句话说),展示你如何看待问题。然后我们可以希望重现该问题。请包含一个带有触发器的简单表的架构,以便我们使用“相同”的目录数据。
它还有助于查找您正在使用的 Informix 版本。您应该能够使用:
SELECT DBINFO('version', 'full') FROM SysTables WHERE TabID = 1;
如果它因为不受支持而失败,那么您的 Informix 早就不支持了。我得到了输出:
IBM Informix Dynamic Server Version 11.70.FC6
我在装有 Mac OS X 10.7.5 的 Mac 上运行。