首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

Oracle 至 SQL Server 主鍵遷移實戰:Delphi 工具開發完整代碼解析

     編輯:關於SqlServer

專案需將 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'

執行前需先建立雙向連接,並做異常捕獲提示。

主鍵遷移核心邏輯

  1. 查詢 Oracle 主鍵資訊:從 USER_CONSTRAINTS 與 USER_CONS_COLUMNS 聯表查詢指定 Owner (budget) 下所有主鍵約束,包含約束名、類型、表名、欄位名、位置,按表名與位置排序。
  2. 驗證 SQL Server 目標表/欄位存在性:遍歷 Oracle 主鍵記錄,查詢 sysobjects 與 syscolumns 確認目標表與欄位是否存在,不存在則記錄錯誤並跳過。
  3. 分組處理同一張表的多欄位主鍵:累積同表欄位名至變數 FieldN,遇新表時對上一張表執行重建主鍵邏輯。
  4. 重建主鍵:查詢 INFORMATION_SCHEMA.KEY_COLUMN_USAGE 判斷主鍵是否已存在,若存在則 DROP CONSTRAINT 刪除舊主鍵,隨後 ALTER TABLE ... ADD CONSTRAINT [PK_表名] PRIMARY KEY NONCLUSTERED (欄位列表) 重建。
  5. 進度顯示與錯誤記錄:使用 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;

此工具雖代碼未經整理,但有效解決了無專業工具環境下的主鍵遷移難題,對類似異構資料庫遷移具參考價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved