Merge Update 有一定的限制,例如想更新的 Table 是個 Nickname 就不行
My Scenario:
Database1: Taurus 建立 Table b1
Database2: Orion 建立 Table a1
建立 Nickname b1 federated from Taurus
在 Database Orion 對 b1 以 Merge 方式將 a1 的值更新到 b1,則會產生錯誤
SQL0270N 不支援函數 (原因碼 = "67")。 SQLSTATE=42997
67 請勿在 MERGE 陳述式中,指定暱稱或暱稱的視圖作為目標。
My Solutions:
1. 能以傳統Update的語法做更新
2. 在 Database Taurus 上建立 nickname a1,在 Taurus 對 b1 做 merge 語法更新之。
※ 無法藉由 Wrapper Server 增加參數 DB2_TWO_PHASE_COMMIT = 'Y' 來達到目的。
/* 建立測試環境 */
C:\>db2 connect to orion
資料庫連線資訊
資料庫伺服器 = DB2/NT 9.7.0
SQL 授權 ID = ADMINIST...
本端資料庫別名 = ORION
C:\>db2 create table a1 ( col1 integer,col2 varchar(16)) in userspace1
DB20000I SQL 指令已順利完成。
C:\>db2 insert into a1 values (1,'TESTING'),(2,'PRODUCTION')
DB20000I SQL 指令已順利完成。
C:\>db2 terminate
DB20000I TERMINATE 指令已順利完成。
C:\>db2 connect to taurus
資料庫連線資訊
資料庫伺服器 = DB2/NT 9.7.0
SQL 授權 ID = ADMINIST...
本端資料庫別名 = TAURUS
C:\>db2 create table b1 ( col1 integer,col2 varchar(16)) in userspace1
DB20000I SQL 指令已順利完成。
C:\>db2 insert into b1(col1) values (1),(2)
DB20000I SQL 指令已順利完成。
C:\>db2 terminate
DB20000I TERMINATE 指令已順利完成。
/* 建立對應Nickname */
C:\>db2 connect to orion
資料庫連線資訊
資料庫伺服器 = DB2/NT 9.7.0
SQL 授權 ID = ADMINIST...
本端資料庫別名 = ORION
C:\>db2 create nickname administrator.b1 for w2taurus.administrator.b1
DB20000I SQL 指令已順利完成。
 
/* 在 Orion Database 上對 Nickname 做 Merge Update */
C:\>db2 merge into b1 using a1 on a1.col1 = b1.col1 when matched then update set
b1.col2 = a1.col2
 
/* 產生錯誤訊息 */
DB21034E 指令被當作 SQL 陳述式處理,因為它不是有效的「指令行處理器」指令。 在 SQL 處理程序期間,它已傳回:
SQL0270N 不支援函數 (原因碼 = "67")。 SQLSTATE=42997
/* 不信邪,想試試 Two phase commit */
C:\>db2 connect to orion
資料庫連線資訊
資料庫伺服器 = DB2/NT 9.7.0
SQL 授權 ID = ADMINIST...
本端資料庫別名 = ORION
C:\>db2 alter server w2taurus options (add DB2_TWO_PHASE_COMMIT 'Y')
DB20000I SQL 指令已順利完成。
 
/* 依舊失敗 */
C:\>db2 merge into b1 using a1 on a1.col1 = b1.col1 when matched then update set
b1.col2 = a1.col2
DB21034E 指令被當作 SQL 陳述式處理,因為它不是有效的「指令行處理器」指令。 在SQL 處理程序期間,它已傳回:
SQL0270N 不支援函數 (原因碼 = "67")。 SQLSTATE=42997
 
/* 再建在 Taurus 上試試 */
C:\>db2 connect to taurus
資料庫連線資訊
資料庫伺服器 = DB2/NT 9.7.0
SQL 授權 ID = ADMINIST...
本端資料庫別名 = TAURUS
C:\>db2 alter server w2orion options(add DB2_TWO_PHASE_COMMIT 'Y')
DB20000I SQL 指令已順利完成。
/* 回到 Database Orion 再試 */
C:\>db2 connect to orion
資料庫連線資訊
資料庫伺服器 = DB2/NT 9.7.0
SQL 授權 ID = ADMINIST...
本端資料庫別名 = ORION
C:\>db2 merge into b1 using a1 on a1.col1 = b1.col1 when matched then update set
b1.col2 = a1.col2
DB21034E 指令被當作 SQL 陳述式處理,因為它不是有效的「指令行處理器」指令。 在SQL 處理程序期間,它已傳回:
SQL0270N 不支援函數 (原因碼 = "67")。 SQLSTATE=42997