如何使用IBexpert在整个SQL数据库中搜索指定字符?
-
08-10-2019 - |
题
如何使用 IBexpert 在整个数据库中搜索某个特定字符?
例如:
我在表的数据的某些部分有一些“'”('),这稍后会给我带来错误,而且我有很多表需要手动搜索......我该怎么做?
谢谢
解决方案
我能想到的最好的办法是您可以生成自己的脚本并针对数据库运行它。在这种情况下,isql(firebird 的命令行工具)比 IBExpert 更好地完成此任务。
因此,第一步是找到所有 char 或 varchar 列,并为每个表中的每个字段构建自定义查询。将此脚本另存为 create_search_script.sql ,保存在数据库所在的同一目录中(如果连接到远程数据库,则保存在任何目录中)。
set heading off;
set blob off;
set width sql 400;
select '--tables with a primary key' from rdb$database;
select
trim(
cast(
'select '
||''''
||trim(rf.rdb$relation_name)
||''''
||', '
||(select list(trim(isg.rdb$field_name))
from rdb$index_segments isg
where isg.rdb$index_name = (select rc.rdb$index_name
from rdb$relation_constraints rc
where rc.rdb$relation_name = rf.rdb$relation_name
and rc.rdb$constraint_type = 'PRIMARY KEY'))
||', '
||trim(rf.rdb$field_name)
||' from '
||trim(rf.rdb$relation_name)
||' where '
||trim(rf.rdb$field_name)
||' like ''%''''%'';'
as varchar(2000))
) sql
from rdb$relation_fields rf
inner join rdb$relations r on r.rdb$relation_name = rf.rdb$relation_name
inner join rdb$fields f on f.rdb$field_name = rf.rdb$field_source
inner join rdb$types t on t.rdb$field_name = 'RDB$FIELD_TYPE' and t.rdb$type = f.rdb$field_type
where t.rdb$type_name = 'TEXT'
and coalesce(r.rdb$system_flag, 0) != 1
and exists (select 1
from rdb$relation_constraints rc
where rc.rdb$relation_name = rf.rdb$relation_name
and rc.rdb$constraint_type = 'PRIMARY KEY'
)
;
select '--tables without a primary key' from rdb$database;
select trim(
'select '
||''''
||trim(rf.rdb$relation_name)
||''''
||', tbl.*'
||' from '
||trim(rf.rdb$relation_name)
||' tbl where '
||trim(rf.rdb$field_name)
||' like ''%''''%'';'
) sql
from rdb$relation_fields rf
inner join rdb$relations r on r.rdb$relation_name = rf.rdb$relation_name
inner join rdb$fields f on f.rdb$field_name = rf.rdb$field_source
inner join rdb$types t on t.rdb$field_name = 'RDB$FIELD_TYPE' and t.rdb$type = f.rdb$field_type
where t.rdb$type_name = 'TEXT'
and coalesce(r.rdb$system_flag, 0) != 1
and not exists (select 1
from rdb$relation_constraints rc
where rc.rdb$relation_name = rf.rdb$relation_name
and rc.rdb$constraint_type = 'PRIMARY KEY'
)
;
现在,启动一个新的命令会话,转到(cd)到该文件夹并运行以下命令:
del search_results.txt
del search_script.sql
isql your-db.fdb -u sysdba -p masterkey -o search_script.sql -i create_search_script.sql
isql your-db.fdb -u sysdba -p masterkey -o search_results.txt -i search_script.sql
如果您使用的是 Linux,isql 工具在某些发行版中被命名为 isql-fb(我认为在 firebird 1.5 之后,不确定)。
替换成你自己的数据库名、用户名和密码 在运行之前在命令行上。
现在,search_results.txt 文件将包含整个数据库的所有匹配记录的列表。
警告 当心...如果该文件夹中有名为 search_script.sql 或 search_results.txt 的文件...在运行命令之前更改文件名或调整命令以使用其他文件名。
isql 命令行工具的 -o 修饰符不会覆盖文件,因此需要首先删除该文件才能获得新的脚本和新的报告。
该脚本在 Windows 中针对 firebird 2.1 服务器进行了测试,但它适用于大多数 firebird 版本和平台。
享受!
其他提示
我将在脚本中导出数据库数据,并使用我喜欢搜索的任何文本编辑器。查看如何导出元数据
不隶属于 StackOverflow