專案需將 Oracle 資料庫遷移至 SQL Server,使用 SQL Server DTS 導入後發現僅遷移了表結構與資料,主鍵約束卻未隨之轉移。因手邊缺乏 ERwin 等專業遷移工具,作者自行開發 Delphi 小工具實現主鍵批量遷移,以下為核心實現邏輯與代碼詳解。
工具採雙連接設計:ADOConnOrcale 連接 Oracle,ADOConnSQLServer 連接 SQL Server,輔以多個 TADOQuery 執行查詢與 DDL 操作。連接字串分別為:
ORAConnStr = 'Provider=MSDAORA.1;Data Source=%s;User ID=%s;Password=%s;Persist Security Info=True'
SQLConnStr = 'Provider=SQLOLEDB.1;Data Source=%s;Initial Catalog=%s;User ID=%s;Password=%s;Persist Security Info=False'
執行前需先建立雙向連接,並做異常捕獲提示。
USER_CONSTRAINTS 與 USER_CONS_COLUMNS 聯表查詢指定 Owner (budget) 下所有主鍵約束,包含約束名、類型、表名、欄位名、位置,按表名與位置排序。sysobjects 與 syscolumns 確認目標表與欄位是否存在,不存在則記錄錯誤並跳過。FieldN,遇新表時對上一張表執行重建主鍵邏輯。INFORMATION_SCHEMA.KEY_COLUMN_USAGE 判斷主鍵是否已存在,若存在則 DROP CONSTRAINT 刪除舊主鍵,隨後 ALTER TABLE ... ADD CONSTRAINT [PK_表名] PRIMARY KEY NONCLUSTERED (欄位列表) 重建。ProgressBar 顯示進度,Memo 記錄缺失表/欄位或執行錯誤。// 判斷 SQL Server 表欄位是否存在
S2.SQL.Text := 'SELECT a.name AS tanme, b.* FROM sysobjects a INNER JOIN syscolumns b ON a.id = b.id WHERE (a.xtype = ''U'') AND (a.name = ''' + O1.FieldByName('table_name').AsString + ''') and b.name = ''' + O1.FieldByName('COLUMN_NAME').AsString + ''' ORDER BY b.id';
// 重建主鍵
with S1 do begin
SQL.Text := 'SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = ''' + tableN + '''';
Open; First;
aa := FieldByName('constraint_name').AsString;
if RecordCount > 0 then begin
SQL.Text := 'ALTER TABLE ' + tableN + ' DROP CONSTRAINT ' + aa;
ExecSQL;
end;
SQL.Text := 'ALTER TABLE ' + tableN + ' WITH NOCHECK ADD CONSTRAINT [PK_' + tableN + '] PRIMARY KEY NONCLUSTERED ( ' + Copy(FieldN, 1, Length(FieldN)-1) + ' )';
ExecSQL;
end;
此工具雖代碼未經整理,但有效解決了無專業工具環境下的主鍵遷移難題,對類似異構資料庫遷移具參考價值。