list触发器没有以“_BI”结尾的系统

时间:2015-12-08 10:44:09

标签: firebird firebird2.5

我想在firebird数据库中列出没有以“_BI”结尾的系统的触发器, 但没有结果

select * from  rdb$triggers
where 
rdb$trigger_source is not null 
and (coalesce(rdb$system_flag,0) = 0) 
and (rdb$trigger_source not  starting with 'CHECK' )
and (rdb$trigger_name like '%BI')

但是使用这种语法,它给了我一个“_bi”和“_BI0U”和“_BI0U”结束结果

and (rdb$trigger_name like '%BI%')

但是使用这种语法它会给我null结果     和(rdb $ trigger_name,如'%@ _ BI')

事先谢谢

1 个答案:

答案 0 :(得分:1)

问题是Firebird系统表使用CHAR(31)作为对象名称,这意味着它们用空格填充,直到声明的长度。因此,使用like '%BI')不会产生结果,除非BI是第30和第31个字符。

有几种解决方案

例如,您可以在检查

之前修剪名称
trim(rdb$trigger_name) like '%BI'

或者您可以要求名称后跟至少一个空格

rdb$trigger_name || ' ' like '%BI %'

在相关说明中,如果您想检查您的触发器名称是否以_BI结尾,那么您还应该在您的条件中包含下划线。由于like中的下划线是单个字符匹配器,因此您需要将其转义:

trim(rdb$trigger_name) like '%\_BI' escape '\'

或者您也可以尝试使用正则表达式,因为您不需要修剪或以其他方式破坏表达式的左侧:

rdb$trigger_name similar to '%\_BI[[:SPACE:]]*' escape '\'