2010-11-11 43 views

回答

2

我能想到的是,你可以生成自己的腳本並運行它針對數據庫的最好。在這種情況下,isql(火鳥命令文本行工具)比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文件......運行該命令之前更改文件名或適應的命令使用其他文件名。

-o isql命令行工具的修飾符不會覆蓋文件,因此需要先刪除該文件才能擁有新的腳本和新的報告。

這個腳本是在windows的firebird 2.1服務器上測試過的,但是它可以用於大多數firebird版本和平臺。

享受!

相關問題