添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

本期特别如何將一般的資料表搬移到總帳資料表。

因為大多數的系統是已經被建立完成的,日後才升級到 SQL Server 2022的版本,因此總帳不是在建立資料表的時後被設定

而是資料表已經建立完成,然後需要透過搬移的方式完成,那麼,該如何做呢?

一般資料表搬移到總帳資料表

無法將一般資料表透過轉換的方式,變成總帳資料表,但是你可以將資料從現有的一般資料表移轉至總帳資料表,然後將原始

資料表取代為總帳資料表。

當執行資料庫總帳驗證時,此流程必須排序每個交易內的所有作業。 如果使用 SELECT INTO BULK INSERT 句子的話,將數十億個資料列

從一般資料表複製到總帳資料表,則全部都會在單一交易中完成。 這表示必須完整排序大量資料,這會在單一執行緒中完成。 排序作業需要很長的時間才能完成。

若要將一般資料表轉換成總帳資料表,微軟建議使用 sys.sp_copy_data_in_batches 預存程序。 這會以每筆交易 1萬到10萬筆的資料列的批次分割複製作業。

因此,資料庫總帳驗證具有較小的交易,可以平行排序。 這可大幅協助縮短資料庫總帳驗證的時間。

建立僅附加的總帳資料表

使用 sys.sp_copy_data_in_batches 預存程序之前,你要建立 僅附加總帳資料表 ,或具有與來源資料表相同結構描述的 可更新總帳資料表

結構描述應該與資料行數量、資料行名稱及其資料類型相同。 TRANSACTION ID SEQUENCE NUMBER GENERATED ALWAYS 資料行會遭到忽略,因為它們是系統產生的。

資料表之間的編製索引可能不同,但目標資料表只能是沒有叢集的 heap資料表或具有叢集索引。 之後應該建立非叢集索引。

假設我們在資料庫中有下列一般 Employees 資料表:

CREATE TABLE [dbo].[Employees](

[EmployeeID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,

[SSN] [char](11) NOT NULL,

[FirstName] [nvarchar](50) NOT NULL,

[LastName] [nvarchar](50) NOT NULL,

[Salary] [money] NOT NULL

建立 僅限附加總帳資料表 可更新總帳資料表 的最簡單方式是在原來的原始資料表指令碼中新增 LEDGER = ON 子句。 下列指令中,根據 Employees 資料表的結構描述來

建立名為 Employees_LedgerTable 新可更新總帳資料表

CREATE TABLE [dbo].[Employees_LedgerTable](

[EmployeeID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,

[SSN] [char](11) NOT NULL,

[FirstName] [nvarchar](50) NOT NULL,

[LastName] [nvarchar](50) NOT NULL,

[Salary] [money] NOT NULL

SYSTEM_VERSIONING = ON,

LEDGER = ON

將資料從一般資料表複製到總帳資料表

可以使用預存程序 sys.sp_copy_data_in_batches 在確定其結構描述相同之後,將資料從來源資料表複製到目的地的資料表。
資料會在個別的交易中以批次方式複製。 如果作業失敗,則會部分填入目標資料表。 目標資料表也應該為空白。

在下列指令碼中,我們會將資料從一般 Employees 資料表複製到新的可更新總帳資料表 ( Employees_LedgerTable )。

sp_copy_data_in_batches @source_table_name = N'Employees' , @target_table_name = N'Employees_LedgerTable'

事實上,並沒有一個快速的方法,可以馬上的把一般的資料表轉成總帳資料表,也沒有什麼精靈能夠這樣做,微軟官方說明的建議就是

先建立一個總帳資料表,再利用預存程序 sp_copy_data_in_batches的方式完成。