2017-07-19 122 views
1

我有Firebird數據庫和字符集WIN1251。數據庫已經有幾個表。現在我想將默認排序規則更改爲WIN1251_UA。所以我不得不執行該語句:更改Firebird數據庫和表的默認排序規則

ALTER CHARACTER SET WIN1251 SET DEFAULT COLLATION WIN1251_UA 

根據this link上面的查詢修改數據庫的默認排序規則。

現在我面臨這個問題:對於所有表格,所有varchar字段仍然有校對WIN1251。我如何更改所有現有表的默認排序規則?

附加信息:使用Firebird 2.5

+0

最可靠的,如果不是非常快速的方式將創建新的字符集中創建新列,複製舊列的內容,刪除舊列,並重新命名新列爲舊名稱,請閱讀http://www.sql.ru/forum/297195 –

+0

@Arioch這裏有太多的表格。 – Evgeny

+0

枚舉它們並自動創建腳本 –

回答

0

您無法更改列的排序規則。您將需要創建一個新列並複製數據,或者使用正確的DDL創建一個新的空數據庫,並使用數據庫泵將數據從一個數據庫移動到另一個數據庫。請參閱this thread in Firebird-support

+0

這不是真的。當然,我可以改變排序規則。看到我的答案。 – Evgeny

0

如何使用IBExpert及其ibeblock創建數據庫的sql轉儲?當你創建它時,只需更改內部的整理內容。

這樣ibeblock的例子:

execute ibeblock 
as 
begin 
cbb = 'execute ibeblock (
     LogLine variant) 
    as 
    begin 
     ibec_progress(LogLine); 
    end'; 

DB = ibec_CreateConnection(__ctInterBase, 
         'DBName="127.0.0.1:mydatabase"; 
          ClientLib=gds32.dll; 
          User=SYSDBA; Password=masterkey; Names=WIN1251; SqlDialect=3'); 
    try 
    ibec_ExtractMetadata(DB, 'c:\test\db.sql', 
         'GenerateCreate; 
          IncludePassword; 
          SetGenerators; 
          ExtractDescriptions; 
          UseComment; 
          ExtractBLOBs; 
          DateFormat=YYYY-MM-DD; 
          DateTimeFormat=YYYY-MM-DD HH:NN:SS; 
          DataTables=MY_TABLE1,MY_TABLE2', 
          cbb); 
    finally 
    ibec_CloseConnection(DB); 
    end; 
end; 
+0

Tnx。但我找到更好的解決方案。看到我的答案。 – Evgeny

+0

到目前爲止你在fb25上可以更新系統表,但在更高版本上,不幸的是... –

0

最後我找到了解決方案。例如,如果我想要更改所有表中所有txt字段的排序規則。我可以用這個查詢做到這一點:如果一些表格txt場完整性約束的一部分

上述過程
update RDB$RELATION_FIELDS set 
RDB$COLLATION_ID = 2 
where rdb$view_context is null and rdb$field_name='TXT'; 

查詢將失敗。

以這種方式,我可以更改sort子句中使用的其他字段。

+0

系統表更新是黑客。這不適用於Firebird 3,因爲系統表的修改已不再允許,並且如果您在該字段上有索引,檢查約束等,或者在比較中使用該字段,它可能會在早期版本中以意想不到的方式中斷一個視圖或存儲過程。 –

相關問題