文章編號: 820675 - 上次校閱: 2007年11月26日 - 版次: 1.9

如何實作雙向交易式複寫

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

結論

本文將逐步告訴您,如何實作雙向交易式複寫。本文也將告訴您參與實作雙向交易式複寫的問題。

雙向交易式複寫

雙向交易式複寫,也稱為雙向交易式複寫允許伺服器必須為發行者和訂閱者相同的資料。因為參與複寫的伺服器會的複寫到其他伺服器,任何變更的任何變更都會不會傳播到原始伺服器。

比方說如果您兩個伺服器 (伺服器 A 和伺服器 B) 伺服器會說是雙向交易式複寫中,兩種下列情況皆成立時:
  • 對資料表 T1,在伺服器所做的變更 A 被複寫到資料表 T1,在伺服器 B。
  • 要在伺服器 B 的表格 T1 做的變更會複寫到資料表 T1,在伺服器 A。
因此,如果變更是來自伺服器 A、 變更複寫到伺服器 B,但伺服器 B 不會傳播回到伺服器 A.複寫相同的變更就會使用迴路偵測機制,用來決定是否要傳送將變更傳回原始伺服器的散發者。

計劃雙向交易式複寫拓樸

雙向交易式複寫的其中一部伺服器可以做為中央訂閱者,且所有其他伺服器訂閱中央訂閱者。因此,在伺服器發出的任何變更會複寫到中央訂閱者並將再中央訂閱者依序複寫所做的變更到所有其他伺服器 (參與複寫。不過,迴路偵測機制協助,散發者會停止從傳播到原始伺服器變更。

比方說如果三部伺服器 ([伺服器 A]、 [伺服器 B 和 [伺服器 C]) 參與雙向交易式複寫,且伺服器 A 中央訂閱者,發行者及訂閱者就會以下列方式維護:
  • 伺服器 A 發佈到伺服器 B 」 和 「 伺服器 C。
  • 伺服器 A 訂閱來自伺服器 B 」 和 「 伺服器 C。
  • 伺服器 B 將發佈至和從只有伺服器訂閱 A。
  • 伺服器 C 發佈至和從只有伺服器訂閱 A。
因此,來自伺服器 B 上的任何變更會複寫到伺服器 A 和伺服器 C。

在雙向交易式複寫的衝突

當您變更參與複寫的伺服器上,所做的變更會複寫到所有其他參與的伺服器。 在此複寫期間而且可能會發生衝突,複寫可能會失敗。下列清單說明可能發生的衝突以及您可以避免這些衝突的方式:
  • 如果您插入到資料表的索引鍵對其中一部伺服器的資料錄已經有相同索引鍵的另一筆記錄存在於其他參與複寫的伺服器上複寫不會傳播對其他伺服器所做的變更。

    建議的動作若要避免這個問題,請確定您在參與複寫的每一部伺服器上使用不同的金鑰。如果要執行這項操作,配置 [預先決定的範圍的參與複寫的每個伺服器的索引鍵]。您也可以在每一部伺服器上使用複合索引鍵。
  • 當您更新已被另一部伺服器刪除的記錄時,UPDATE 陳述式會影響零資料列位置已刪除資料錄,複寫就會失敗並發生錯誤伺服器上。

    建議的動作若要避免這個問題,執行下列步驟之一:
    • 移除 @ @ ROWCOUNT 更新自訂預存程序中實際的 UPDATE 陳述式之後檢查。

      -或者-
    • 使用 -Skiperrors 散發代理程式才會略過此錯誤的參數。如需有關在交易式複寫中略過錯誤的詳細資訊,請造訪下列 Microsoft 網站]:
      http://msdn2.microsoft.com/en-us/library/aa178842(SQL.80).aspx (http://msdn2.microsoft.com/en-us/library/aa178842(SQL.80).aspx)
      -或者-
    • 在更新的 UPDATE 陳述式預存程序之前,請尋找一筆記錄。如果沒有記錄略過在 UPDATE 陳述式,且該記錄刪除所有訂閱者上。
  • 當您更新在另一部伺服器上同時更新一筆記錄中的一個資料行時,資料可能會在兩個伺服器上不同。

    建議的動作若要避免這個問題,判斷其他伺服器上同時是否正在更新資料,並進行任何必要的動作。若要執行這項操作、 修改更新自訂預存程序以及使用 XCALL 語法來呼叫更新預存程序]。XCALL 語法會提供值的所有資料行之前更新程序稱為,提供資料行中的之更新的值。更新預存程序呼叫之前,您可以比較值對資料行的目前值。如果您看到的不同的數值正在更新資料行同時由不同的伺服器。您可以自訂預存程序,以選取哪個值仍然存在。如需有關如何使用 XCALL 的詳細資訊,請造訪下列 Microsoft 網站]:
    http://msdn2.microsoft.com/en-us/library/Aa237133(SQL.80).aspx (http://msdn2.microsoft.com/en-us/library/Aa237133(SQL.80).aspx)
    附註您可以指定 XCALL 語法來呼叫對應的更新預存程序,或在發行集時使用 sp_addarticle 刪除預存程序。您也可以使用 SQL Server 企業管理員,以指定 XCALL 語法。如果要執行這項操作,請依照下列步驟執行:
    1. 在 [SQL Server 企業管理員] 中,找出您想要的出版物。
    2. 在發行集按一下滑鼠右鍵,然後按一下 [內容]。
    3. 按一下 [發行項] 頁籤、 找出發行項,然後按一下 [發行項的屬性按鈕 (...) 之發行項旁邊。
    4. 在 [資料表發行項屬性] 對話方塊按一下 [指令] 索引標籤。
    5. 與此預存程序呼叫取代 UPDATE 命令] 文字方塊中輸入 XCALL,],然後再按一下 [確定]]。
    6. 發行集屬性] 對話方塊中,按一下 [確定]
  • 當您更新一個資料錄中的不同資料行時,同時更新的資料錄的不同資料行有時可能導致衝突。

    建議的動作若要避免這個問題,判定是否相同的資料錄中不同的資料行都在同一時間更新的並且進行任何必要的動作。 執行這項操作、 修改更新自訂預存程序,然後使用 [XCALL 語法呼叫更新預存程序。因為更新預存程序呼叫之前,XCALL 語法會提供值,您可以更新預存程序加入下列選項之一之前執行實際的更新,:
    • 比較目前的值,對它們的值之前更新預存程序資料行,會呼叫所有。
    • 新增資料行代表資料列版本,並比較其目前值與它的值,更新預存程序之前被呼叫。
    不同的值則表示不同的資料行,正在更新一次。您接著可以決定要更新資料行。
  • 當您刪除正在進行由另一部伺服器同時更新的資料列時,複寫可能會失敗。

    建議的動作若要決定是否資料列就會更新,並在同一時間刪除使用 XCALL 語法中刪除預存程序]。刪除預存程序呼叫之前正在刪除對值之資料列的每個資料行相比較。不同的值則表示這些更新執行一次。您可以刪除或保留更新的資料列。

    附註即使您未刪除在訂閱者記錄,記錄不再存在於伺服器來自 [DELETE 陳述式。
  • 當您刪除正在參與複寫的另一部伺服器上同時刪除的資料列時,複寫動作會失敗,因為 DELETE 陳述式並不會影響在某些 「 訂閱者上的任何資料列。

    建議的動作若要避免這個問題,執行下列步驟之一:
    • 移除 @ @ ROWCOUNT 更新自訂預存程序中實際的 DELETE 陳述式之後檢查。

      -或者-
    • 使用 -Skiperrors 在散發代理程式要跳過這個錯誤的參數。如需有關在交易式複寫中略過錯誤的詳細資訊,請造訪下列 Microsoft 網站]:
      http://msdn2.microsoft.com/en-us/library/aa178842(SQL.80).aspx (http://msdn2.microsoft.com/en-us/library/aa178842(SQL.80).aspx)
附註每個部署可能需要以不同的方法來解決這些衝突根據商務需求而定。這些衝突也比較容易解決當涉及只有兩個伺服器。當牽涉到兩個以上的伺服器就可以使用預存程序來判斷哪個伺服器發出所做的變更。用來更新伺服器 C 中的資料錄更新預存程序並不會知道變更是否來自伺服器 A 或在伺服器 B。與合併複寫不同的是交易式複寫不被設計來解決衝突。部署交易式複寫,而不是可避免衝突的案例中僅解決。

實作雙向交易式複寫

若要實作雙向交易式複寫,下列所有條件都必須成立:
  • 資料會複寫伺服器之間進行同步處理。
  • 複寫所使用的預存程序位於所有參與的資料庫中。
  • 訂閱設定成 [使用 @ loopback_detection = 'true' 參數。

    附註選擇 設定 @ loopback_detection = 'true' 不在使用者介面中目前可供使用。因此,您必須訂閱使用 sp_addsubscription 預存程序。
如果執行一個備份及還原請記住不同站台需要主索引鍵,以確定不會建立重複的主索引鍵上的不同條件約束。同時別忘了 NOT FOR 複寫子句建立所有的條件約束]。

若要設定執行 SQL Server 2000 的電腦上的雙向交易式複寫,您可以使用下列的範例。

附註Transact-SQL 陳述式會列出每個以下的步驟。執行 Transact-SQL 陳述式來執行所提及的工作在先前的步驟。
  1. 在執行 SQL Server 的電腦上建立散發者、 發行者和 「 訂閱者 」。如果要執行這項操作,請依照下列步驟執行:
    1. 建立兩個資料庫:
      use master
      go
      
      create database test1
      go
      
      create database test2
      go
      
    2. 建立具有 IDENTITY 資料行設定 NOT FOR 複寫選項的兩個資料表:
      use test1
      go
      
      create table two_way_test1 
      (
      	pkcol		INTEGER PRIMARY KEY NOT NULL,
      	intcol		INTEGER IDENTITY(1,1) NOT FOR REPLICATION,
       	charcol		CHAR(100),
      	timestampcol 	TIMESTAMP
      )
      
      use test2
      go
      
      create table two_way_test2 
      (
      	pkcol 		INTEGER PRIMARY KEY NOT NULL,
      	intcol 		INTEGER IDENTITY(1000000000,1) NOT FOR REPLICATION,
       	charcol 	CHAR(100),
       	timestampcol 	TIMESTAMP
      )
      go
    3. 配置在預先決定的主索引鍵資料行的值範圍,以使不同的伺服器上的值不相同的範圍內。比方說可以強制 1-1000年為索引鍵範圍 two_way_test1 資料表 test1] 資料庫中,然後再強制 1001年-2000 test2 資料庫中的 two_way_test2 資料表索引鍵範圍和。如果要執行這項操作,使用下列程式碼:
      	-- Constraint to enforce a range of values between 1 and 1000 in database test1 
      use test1
      go
      
      alter table 
      	two_way_test1 
      with nocheck 
      add constraint 
      	checkprimcol check NOT FOR REPLICATION 
      	(
      		pkcol BETWEEN 1 and 1000
      	) 
      go 
      
      
      use test2
      go
      
      	-- Constraint to enforce a range of values between 1001 and 2000 in the database test2 
      
      alter table 
      	two_way_test2
      with nocheck 
      add constraint 
      	checkprimcol check NOT FOR REPLICATION 
      	(
      		pkcol BETWEEN 1001 and 2000
      	) 
      go 
      
      
  2. 啟用您的伺服器作為 「 散發者,然後建立散發資料庫:
    use master
    go
    sp_adddistributor @distributor = '<distributor name>' 
    go
    use master
    go
    sp_adddistributiondb @database='distribution'
    go
  3. 啟用的所有電腦執行 SQL Server 會參與發行者為複寫:
    use master
    go
    
    exec sp_adddistpublisher 
    	@publisher = '<Your Server Name>', 
    	@distribution_db ='distribution', 
    	@security_mode = 0, 
    	@login = 'sa', 
    	@password = 'sa',
    	@working_directory ='<Location of Directory>'
  4. 啟用所有已識別的資料庫,供複寫:
    use master
    go
    
    exec sp_replicationdboption N'test1', N'publish', true
    go
    
    exec sp_replicationdboption N'test2', N'publish', true
    go
    
  5. 為 INSERT UPDATE,建立自訂的預存程序,並刪除上套用複寫期間所做的變更的所有資料庫的作業。

    附註通常時將值插入 IDENTITY 資料行, 之資料表的 [IDENTITY_INSERT] 選項必須為 ON。這項工作是藉由連入複寫代理程式的 NOT FOR 複寫選項來達成。

    您不能更新中 IDENTITY 資料行的值。因此,當您在複寫期間更新值,您可以移除舊的值,並插入新的值。若要建立自訂的預存程序,請依照下列步驟執行:
    1. Create the custom stored procedures in the test1 database:
      use test1
      go
      
      -- INSERT Stored Procedure
      
      create procedure sp_ins_two_way_test1	
      	@pkcol int, 
      	@intcol int, 
      	@charcol char(100), 
      	@timestampcol timestamp,
      	@rowidcol uniqueidentifier
      as
      	insert into two_way_test1 
      	(
      		pkcol,
      		intcol,
      		charcol
      	) 
      	values
      	(
      		@pkcol, 
      		@intcol, 
      		@charcol
      	)
      go
      
      --UPDATE Stored Procedure
      
      create procedure sp_upd_two_way_test1	
      	@pkcol int, 
          	@intcol int, 
          	@charcol char(100), 
          	@timestampcol timestamp,
      	@rowidcol uniqueidentifier,
          	@old_pkcol int
      as
      	declare @x int
      	declare @y int
      	declare @z char(100)
       
      	select 
      		@x=pkcol, 
      		@y=intcol, 
      		@z=charcol 
      	from 
      		two_way_test1 
      	where 
      		pkcol = @pkcol
      
      
      
      	delete 
      		two_way_test1 
      	where 
      		pkcol=@pkcol
      
      
      
      	insert into two_way_test1 
      	(
      		pkcol, 
      		intcol, 
      		charcol
      	) 
      	values
      	(
      		case isnull(@pkcol,0) when 0 then @x else @pkcol end,
      		case isnull(@intcol,0) when 0 then @y else @intcol end,
      		case isnull(@charcol,'N') when 'N' then @z else @charcol end
      	)
      go
      
      --  DELETE Stored Procedure
      
      create procedure sp_del_two_way_test1 
      	@old_pkcol int
      as
      	delete 
      		two_way_test1 
      	where 
      		pkcol = @old_pkcol
      go
      
      
    2. Create the custom stored procedures in the test2 database:
      use test2
      go
      
      -- INSERT Stored Procedure
      
      create procedure sp_ins_two_way_test2	
      	@pkcol int, 
      	@intcol int, 
      	@charcol char(100), 
      	@timestampcol timestamp,
      	@rowidcol uniqueidentifier
      as
      	insert into two_way_test2 
      	(
      		pkcol,
      		intcol,
      		charcol
      	) 
      	values
      	(
      		@pkcol, 
      		@intcol, 
      		@charcol
      	)
      go
      
      --UPDATE Stored Procedure
      
      create procedure sp_upd_two_way_test2	
      	@pkcol int, 
          	@intcol int, 
          	@charcol char(100), 
          	@timestampcol timestamp,
      	@rowidcol uniqueidentifier,
          	@old_pkcol int
      as
      	declare @x int
      	declare @y int
      	declare @z char(100)
       
      	select 
      		@x=pkcol, 
      		@y=intcol, 
      		@z=charcol 
      	from 
      		two_way_test2 
      	where 
      		pkcol = @pkcol
      
      
      
      	delete 
      		two_way_test2 
      	where 
      		pkcol=@pkcol
      
      
      
      	insert into two_way_test2 
      	(
      		pkcol, 
      		intcol, 
      		charcol
      	) 
      	values
      	(
      		case isnull(@pkcol,0) when 0 then @x else @pkcol end,
      		case isnull(@intcol,0) when 0 then @y else @intcol end,
      		case isnull(@charcol,'N') when 'N' then @z else @charcol end
      	)
      go
      
      
      --  DELETE Stored Procedure
      
      create procedure sp_del_two_way_test2 
      	@old_pkcol int
      as
      	delete 
      		two_way_test2 
      	where 
      		pkcol = @old_pkcol
      go
      
  6. 建立交易式發行集,然後將文章新增至出版物的 test1test2 資料庫:
    --In the database test1.
    
    use test1
    go
    
    --  Adding the transactional publication.
    exec sp_addpublication 
    	@publication = N'two_way_pub_test1', 
    	@restricted = N'false',
    	@sync_method = N'native', 
    	@repl_freq = N'continuous',
    	@description = N'Transactional publication of database test1.',
    	@status = N'active', 
    	@allow_push = N'true', 
    	@allow_pull = N'true',
    	@allow_anonymous = N'false', 
    	@enabled_for_internet = N'false',
    	@independent_agent = N'false', 
    	@immediate_sync = N'false',
    	@allow_sync_tran = N'true', 
    	@autogen_sync_procs = N'true',
    	@retention = 72
    go
    
    exec sp_addpublication_snapshot 
    	@publication = N'two_way_pub_test1',
    	@frequency_type = 4,
    	@frequency_interval = 1, 
    	@frequency_relative_interval = 0,
    	@frequency_recurrence_factor = 1, 
    	@frequency_subday = 1,
    	@frequency_subday_interval = 0, 
    	@active_start_date = 0,
    	@active_end_date = 0, 
    	@active_start_time_of_day = 233000,
    	@active_end_time_of_day = 0
    go
    
    --  Adding the transactional articles.
    
    exec sp_addarticle 
    	@publication = N'two_way_pub_test1', 
    	@article = N'two_way_test1',
    	@source_owner = N'dbo', 
    	@source_object = N'two_way_test1',
    	@destination_table = N'two_way_test1', 
    	@type = N'logbased',
    	@creation_script = null, 
    	@description = null, 
    	@pre_creation_cmd = N'drop',
            @schema_option = 0x00000000000000F1, 
    	@status = 16,
    	@vertical_partition = N'false', 
    	@ins_cmd = N'CALL sp_ins_two_way_test2',
    	@del_cmd = N'CALL sp_del_two_way_test2',
    	@upd_cmd = N'CALL sp_upd_two_way_test2', 
    	@filter = null,
    	@sync_object = null
    go
    
    --  In the database test2
    use test2
    go
    
    --  Adding the transactional publication.
    
    exec sp_addpublication 
    	@publication = N'two_way_pub_test2', 
    	@restricted = N'false',
    	@sync_method = N'native', 
    	@repl_freq = N'continuous',
    	@description = N'Transactional publication of database test2',
    	@status = N'active', 
    	@allow_push = N'true', 
    	@allow_pull = N'true',
    	@allow_anonymous = N'false', 
    	@enabled_for_internet = N'false',
    	@independent_agent = N'false', 
    	@immediate_sync = N'false',
    	@allow_sync_tran = N'true', 
    	@autogen_sync_procs = N'true',
    	@retention = 72
    go
    
    exec sp_addpublication_snapshot 
    	@publication = N'two_way_pub_test2',
    	@frequency_type = 4,
    	@frequency_interval = 1, 
    	@frequency_relative_interval = 0,
    	@frequency_recurrence_factor = 1, 
    	@frequency_subday = 1,
    	@frequency_subday_interval = 0, 
    	@active_start_date = 0,
    	@active_end_date = 0, 
    	@active_start_time_of_day = 233000,
    	@active_end_time_of_day = 0
    go
    
    --  Adding the transactional articles.
    exec sp_addarticle 
    	@publication = N'two_way_pub_test2', 
    	@article = N'two_way_test2',
    	@source_owner = N'dbo', 
    	@source_object = N'two_way_test2',
    	@destination_table = N'two_way_test2', 
    	@type = N'logbased',
    	@creation_script = null, 
    	@description = null, 
    	@pre_creation_cmd = N'drop',
    	@schema_option = 0x00000000000000F1, 
    	@status = 16,
    	@vertical_partition = N'false', 
    	@ins_cmd = N'CALL sp_ins_two_way_test1',
    	@del_cmd = N'CALL sp_del_two_way_test1',
    	@upd_cmd = N'CALL sp_upd_two_way_test1', 
    	@filter = null,
    	@sync_object = null
    go
    
  7. 參與複寫的所有伺服器都啟用為訂閱者:
    exec sp_addsubscriber 
    	@subscriber = '<Your Server Name>', 
    	@login = '<login name>', 
    	@password = '<password>'
    go
    
    
  8. 識別其中一個資料庫為中央訂閱者。 在所有參與複寫,以便所有資料庫都訂閱中央訂閱者及中央訂閱者會訂閱其他所有資料庫的資料庫中建立交易式訂閱。

    比方說在這種情況下 test1 資料庫為中央訂閱者。建立交易式訂閱,訂閱發行集在 test1test2 資料庫中和訂閱發行集在 test2test1 資料庫中。

    附註啟用 [LOOPBACK_DETECTION 選項以建立所有訂閱。

    如果要執行這項操作,使用下列程式碼:
    --Adding the transactional subscription in test1.
    
    use test1
    go
    exec sp_addsubscription 
    	@publication = N'two_way_pub_test1', 
    	@article = N'all', 
    	@subscriber = '<Your Server Name>', 
    	@destination_db = N'test2', 
    	@sync_type = N'none', 
    	@status = N'active', 
    	@update_mode = N'sync tran', 
    	@loopback_detection = 'true'
    go
    
    -- Adding the transactional subscription in test2.
    
    use test2
    go
    exec sp_addsubscription 
    	@publication = N'two_way_pub_test2', 
    	@article = N'all', 
    	@subscriber = '<Your Server Name>', 
    	@destination_db = N'test1', 
    	@sync_type = N'none', 
    	@status = N'active', 
    	@update_mode = N'sync tran', 
    	@loopback_detection = 'true'
    go
    
附註您也可以藉由使用 sp_scriptpublicationcustomprocs 系統預存程序建立的所有發行集的自訂預存程序。如需有關 sp_scriptpublicationcustomprocs 系統預存程序的詳細資訊,請參閱 SQL Server 2000 已更新線上叢書 》 sp_scriptpublicationcustomprocs 」 主題]。

附註SQL 查詢分析器傳回每個資料行只 256 個字元。您可以變更這個選項,到最大允許值。



?考

如需詳細資訊按一下 [下列面的文件編號,檢視 「 Microsoft 知識庫 」 中發行項]:
320499? (http://support.microsoft.com/kb/320499/EN-US/ ) 如何以手動方式使用備份或還原,以同步處理複寫訂閱
299903? (http://support.microsoft.com/kb/299903/ ) FIX: sp_scriptpublicationcustomprocs 會產生複寫預存程序
327817? (http://support.microsoft.com/kb/327817/ ) INF: 使用"-SkipErrors 「 散發代理程式 」 中的參數小心翼翼
如其他有關實作 SQL Server 7.0 中的雙向交易式複寫的資訊,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中 「 文件:
300164? (http://support.microsoft.com/kb/300164/EN-US/ ) INF: 如何設定交易式複寫 「 訂閱者 」 和 「 發行者 」 上識別資料行
240235? (http://support.microsoft.com/kb/240235/ ) 注意:"實作 nonpartitioned、 雙向、 交易式複寫 「 線上叢書 》 中的範例包含錯誤

這篇文章中的資訊適用於:
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2000 64-bit Edition
關鍵字:?
kbmt kbreplication kbcode kbtsql kbhowtomaster KB820675 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:820675? (http://support.microsoft.com/kb/820675/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。