代码之家  ›  专栏  ›  技术社区  ›  Bruno 'Shady'

如何使用IBexpert在整个SQL数据库中搜索指定字符?

  •  0
  • Bruno 'Shady'  · 技术社区  · 14 年前

    例如:

    我有一些“'”(')在表的数据的某些部分,这将使我在以后的错误,我有许多表手动搜索。。。我该怎么做?

    2 回复  |  直到 14 年前
        1
  •  2
  •   jachguate    14 年前

    我能想到的是,您可以生成自己的脚本,并对数据库运行它。在这种情况下,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的文件。。。在运行命令之前更改文件名,或调整命令以使用其他文件名。

    这个脚本是在windows中的firebird 2.1服务器上测试的,但是它将适用于大多数firebird版本和平台。

        2
  •  0
  •   Attila Szasz    14 年前

    我将在脚本中导出数据库数据,并使用我喜欢搜索的任何文本编辑器。 See how to Export Metadata

    推荐文章