0

IBexpertを使用してデータベース全体の特定の文字を検索するにはどうすればよいですか?

例えば:

テーブルのデータの一部に「'」(')があり、後でエラーが発生します。手動で検索するテーブルがたくさんあります...どうすればよいですか?

どうも

4

2 に答える 2

2

私が考えることができる最善の方法は、独自のスクリプトを生成してデータベースに対して実行できることです。この場合、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 バージョンとプラットフォームで動作します。

楽しみ!

于 2010-11-11T19:50:42.230 に答える
0

データベースデータをスクリプトでエクスポートし、検索したいテキストエディタを使用します。 メタデータをエクスポートする方法を見る

于 2011-07-11T08:15:06.273 に答える