IBexpertを使用してデータベース全体の特定の文字を検索するにはどうすればよいですか?
例えば:
テーブルのデータの一部に「'」(')があり、後でエラーが発生します。手動で検索するテーブルがたくさんあります...どうすればよいですか?
どうも
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 バージョンとプラットフォームで動作します。
楽しみ!
データベースデータをスクリプトでエクスポートし、検索したいテキストエディタを使用します。 メタデータをエクスポートする方法を見る