SET INTEGRITY 陳述式
SET INTEGRITY 陳述式用來設定表格的完整性擱置狀態、將表格置於完整存取狀態,以及刪改一或多個暫置表格的內容。
- 透過對一個以上表格執行必要的完整性處理,讓這些表格脫離設定完整性擱置狀態 (先前稱為
檢查擱置狀態
)。 - 讓一或多個表格脫離設定完整性擱置狀態,而不對那些表格執行必要的完整性處理。
- 將一或多個表格置於設定完整性擱置狀態。
- 將一或多個表格置於完整存取狀態。
- 刪改一或多個暫置表格的內容。
在載入或附加表格之後,當使用陳述式來執行表格的完整性處理程序時,系統可以漸進式處理表格,方法是只檢查附加的部分是否有限制違規。 如果主題表格是具體化查詢表格或暫置表格,並對其基礎表格執行載入、連接或分離作業,則系統可以漸進式重新整理具體化查詢表格,或漸進式延伸至其基礎表格的差異部分。 不過,在某些情況下,系統將無法執行這類最佳化,而會改為執行完整完整性處理,以確保資料完整性。 透過檢查整個表格是否有限制違規、重新計算具體化查詢表格的定義,或將暫置表格標示為不一致,來完成完整完整性處理。 後者暗示需要完整重新整理其相關聯的具體化查詢表格。 也有一種狀況,您可能想要指定 INCREMENTAL 選項來明確要求增量處理。
SET INTEGRITY 陳述式在交易控制下。
透過設定 DB2_EXTENDED_OPTIMIZATION 登錄變數,可以在非 MPP 環境中啟用集完整性限制及參照完整性檢查的 SMP 平行化。 如果使用 PRLSI ON 選項,則只會平行化 not incremental 設定完整性陳述式。 若要平行化增量及非增量集完整性陳述式,請使用 PRLSI INCR 選項。 若要查看如何設定此項的範例,請參閱 範例 14。呼叫
此陳述式可以內嵌在應用程式中,或透過使用動態 SQL 陳述式來發出。 它是可執行的陳述式,只有在 DYNAMICRULES 執行行為對套件有效時才能動態準備 (SQLSTATE 42509)。
授權
執行 SET INTEGRITY 陳述式所需的專用權取決於目的,如下列清單所概述。
- 使表格脫離設定完整性擱置狀態,並執行必要的完整性處理。陳述式的授權 ID 所保留的專用權必須至少包含下列其中一項:
- 上的 CONTROL 專用權:
- 對其執行完整性處理的表格,以及如果為其中一個以上表格提供異常狀況表格,則為異常狀況表格的 INSERT 專用權 或包含異常狀況表格之綱目的 INSERTIN 專用權
- 陳述式將隱含地置於設定完整性擱置狀態的所有衍生外部索引鍵表格、衍生立即具體化查詢表格及衍生立即暫置表格
- 對資料庫 的 LOAD 權限或對包含表格 的綱目的 LOAD 權限 (含條件)。 必須全部符合下列條件,才能將 LOAD 權限視為提供有效的專用權:
- 必要的完整性處理不涉及下列動作:
- 重新整理具體化查詢表格
- 延伸至暫置表格
- 更新產生的直欄或身分直欄
- 如果為一個以上表格提供異常狀況表格,則在執行完整性處理的表格及相關聯異常狀況表格的完整性處理期間,會授與必要的存取權。 亦即:
- 對每一個執行完整性處理之表格的 SELECT 及 DELETE 專用權,對包含執行完整性處理之表格的綱目的 或 SELECTIN 及 DELETEIN 專用權 及
- 異常狀況表格的 INSERT 專用權 或包含異常狀況表格之綱目的 INSERTIN 專用權
- 必要的完整性處理不涉及下列動作:
- 相關綱目的 DATAACCESS 權限
- DATAACCESS 權限
- 上的 CONTROL 專用權:
- 將表格移出設定完整性擱置狀態,而不執行必要的完整性處理程序。陳述式的授權 ID 所保留的專用權必須至少包含下列其中一項:
- 正在處理之表格的 CONTROL 專用權; 陳述式將隱含地置於設定完整性擱置狀態的每一個衍生外部索引鍵表格、衍生立即具體化查詢表格及衍生立即暫置表格的 CONTROL 專用權
- 資料庫 上的 LOAD 權限或相關綱目 上的 LOAD 權限
- 相關綱目上的 DATAACCESS 權限 或 DATAACCESS 權限
- 相關綱目上的 DBADM 權限 或 SCHEMAADM 權限
- 將表格置於設定完整性擱置狀態。陳述式的授權 ID 所保留的專用權必須至少包含下列其中一項:
- 上的 CONTROL 專用權:
- 指定的表格,以及
- 將由陳述式置於設定完整性擱置狀態的衍生外部索引鍵表格,以及
- 將由陳述式置於設定完整性擱置狀態的衍生立即具體化查詢表格,以及
- 將由陳述式置於設定完整性擱置狀態的衍生立即暫置表格
- 資料庫 上的 LOAD 權限或相關綱目 上的 LOAD 權限
- 相關綱目上的 DATAACCESS 權限 或 DATAACCESS 權限
- 相關綱目上的 DBADM 權限 或 SCHEMAADM 權限
- 上的 CONTROL 專用權:
- 將表格置於完整存取狀態。陳述式的授權 ID 所保留的專用權必須至少包含下列其中一項:
- 對處於完整存取權狀態之表格的 CONTROL 專用權
- 資料庫 上的 LOAD 權限或相關綱目 上的 LOAD 權限
- 相關綱目上的 DATAACCESS 權限 或 DATAACCESS 權限
- 相關綱目上的 DBADM 權限 或 SCHEMAADM 權限
- 刪改暫置表格。陳述式的授權 ID 所保留的專用權必須至少包含下列其中一項:
- 正在刪改之表格的 CONTROL 專用權
- 相關綱目上的 DATAACCESS 權限 或 DATAACCESS 權限
語法
說明
- FOR 表格名稱
- 識別一或多個表格以進行完整性處理。 它必須是型錄中所說明的表格,且不能是視圖、型錄表格或類型化表格。
- OFF
- 指定表格處於設定完整性擱置狀態。 在處於設定完整性擱置狀態的表格上,只容許非常有限的活動。 access-mode-clause
- 指定表格處於設定完整性擱置狀態時的可讀性。
- NO ACCESS
- 指定將表格置於設定完整性擱置無存取狀態,這不容許對表格進行讀取或寫入存取。
- 讀取權
- 指定表格要置於設定完整性擱置讀取存取狀態,這容許對表格未附加部分進行讀取存取。 在處於設定完整性擱置無存取狀態 (SQLSTATE 428FH) 的表格上不容許此選項。
cascade-clause - 指定 SET INTEGRITY 陳述式中所參照表格的設定完整性擱置狀態是否要立即重疊顯示至衍生表格。
- 立即重疊顯示
- 指定將設定完整性擱置狀態立即延伸至衍生表格。 to-descendent-types
- 指定集合完整性擱置狀態立即重疊顯示的衍生表格類型。
- 至所有表格
- 指定將設定完整性擱置狀態立即重疊顯示至呼叫清單中表格的所有衍生表格。 衍生表格包括所有衍生外部索引鍵表格、立即暫置表格及立即具體化查詢表格,這些表格是呼叫清單中表格的後代,或衍生外部索引鍵表格的後代。
指定 TO ALL TABLES 相當於在相同陳述式中指定 TO 外部索引鍵表格、TO MATERIALIZED QUERY TABLES 及 TO STAGING TABLES。
- TO MATERIALIZED QUERY TABLES
- 如果只指定 TO MATERIALIZED QUERY TABLES ,則設定完整性擱置狀態只會立即重疊顯示至衍生立即具體化查詢表格。 當表格離開設定完整性擱置狀態時,必要的話,其他衍生表格稍後可能會進入設定完整性擱置狀態。 如果同時指定 TO 外部索引鍵表格及 TO 具體化 QUERY TABLES ,則會立即將設定完整性擱置狀態重疊顯示至所有衍生外部索引鍵表格、呼叫清單中表格的所有衍生立即具體化查詢表格,以及作為衍生外部索引鍵表格後代的所有立即具體化查詢表格。
- 至外部索引鍵表格
- 指定將設定完整性擱置狀態立即重疊顯示至衍生外部索引鍵表格。 當表格離開設定完整性擱置狀態時,必要的話,其他衍生表格稍後可能會進入設定完整性擱置狀態。
- 目標暫置表格
- 指定將設定完整性擱置狀態立即重疊顯示至衍生暫置表格。 當表格離開設定完整性擱置狀態時,必要的話,其他衍生表格稍後可能會進入設定完整性擱置狀態。 如果同時指定 TO 外部索引鍵表格及 TO STAGING TABLES ,則會立即將設定完整性擱置狀態重疊顯示至所有衍生外部索引鍵表格、呼叫清單中表格的所有衍生立即暫置表格,以及作為衍生外部索引鍵表格後代的所有立即暫置表格。
- 重疊顯示延遲
- 指定只將呼叫清單中的表格置於設定完整性擱置狀態。 衍生表格的狀態將保持不變。 當檢查後代外部索引鍵表格的母表格是否有限制違規時,稍後可能會隱含地將其置於設定完整性擱置狀態。 當檢查其其中一個基礎表格是否有完整性違規時,衍生立即具體化查詢表格及衍生立即暫置表格可能會隱含地進入設定完整性擱置狀態。 如果查詢而非指定的表格存取未處於設定完整性擱置狀態的合格具體化查詢表格,則查詢處於設定完整性擱置狀態的表格可能會成功。
- 立即檢查
- 指定透過在表格上執行必要的完整性處理程序,將表格從設定完整性擱置狀態中取出。 這是根據 SYSCAT.TABLES 型錄視圖的 STATUS 及 CONST_CHECKED 直欄中設定的資訊來完成。 亦即:
- STATUS 直欄中的值必須是
C
(表格處於設定完整性擱置狀態) ,或傳回錯誤 (SQLSTATE 51027) ,除非表格是清單中所指定表格的衍生外部索引鍵表格、衍生具體化查詢表格或衍生暫置表格,處於設定完整性擱置狀態,且其中間上代也在清單中。 - 如果要檢查的表格處於設定完整性擱置狀態,則 CONST_CHECKED 中的值會指出要檢查哪些完整性選項。
當表格離開設定完整性擱置狀態時,必要的話,會將其衍生表格置於設定完整性擱置狀態。 會傳回警告,指出衍生表格已進入設定完整性擱置狀態 (SQLSTATE 01586)。
如果表格是系統維護的具體化查詢表格,則會根據查詢來檢查資料,並視需要重新整理資料。 (IMMEDIATE CHECKED 無法用於使用者維護的具體化查詢表格 或備用表格。) 如果表格是暫置表格,則會根據其查詢定義來檢查資料,並視需要進行傳送。
當檢查子表格的完整性時:- 其任何母項都不能處於設定完整性擱置狀態,或
- 必須在相同的 SET INTEGRITY 陳述式中檢查其每一個母項是否有限制違規
重新整理立即具體化查詢表格或將差異延伸到暫置表格時:- 其任何基礎表格都不能處於設定完整性擱置狀態,或
- 必須在相同的 SET INTEGRITY 陳述式中檢查其每一個基礎表格
- table-checked-options
- 線上選項
- 指定表格在處理時的可存取性。
- ALLOW NO ACCESS
- 指定除了使用「未確定的讀取」隔離層次之外,其他使用者都無法在處理表格時存取表格。
- ALLOW READ ACCESS
- 指定其他使用者在處理表格時對表格具有唯讀存取權。
- ALLOW WRITE ACCESS
- 指定其他使用者在處理表格時,對表格具有讀取及寫入權。
- 產生身分
- 指定如果表格包括身分直欄,則由 SET INTEGRITY 陳述式產生值。 依預設,當指定 GENERATE IDENTITY 選項時, SET INTEGRITY 陳述式只會產生附加橫列的身分直欄值。 NOT INCREMENTAL 選項必須與 GENERATE IDENTITY 選項一起指定,才能讓 SET INTEGRITY 陳述式針對表格中的所有橫列 (包括附加的橫列、載入的橫列及現有橫列) 產生身分直欄值。 如果未指定 GENERATE IDENTITY 選項,則表格中所有列的現行身分直欄值保持不變。 當表格是系統期間時間表格時,只有在第一次發出具有 DROP VERSIONING 子句 (SQLSTATE 428FH) 的 ALTER TABLE 陳述式時,才容許具有 NOT INCREMENTAL 選項的 GENERATE IDENTITY。 query-optimization-options
- 指定用於維護 REFRESH DEFERRED 具體化查詢表格的查詢最佳化選項。
- ALLOW QUERY OPTIMIZATION USING REFRESH DEFERRED TABLES WITH REFRESH AGE ANY
- 指定當 CURRENT REFRESH AGE 特別暫存器設為
任何
時, 表格名稱 的維護將容許使用 REFRESH DEFERRED 具體化查詢表格來最佳化維護 表格名稱的查詢。 如果 table-name 不是 REFRESH DEFERRED 具體化查詢表格,則會傳回錯誤 (SQLSTATE 428FH)。 查詢最佳化期間,會一再考量 REFRESH IMMEDIATE 具體化查詢表格。
檢查選項- 指定表格在處理時的可存取性。
- 增量選項
- INCREMENTAL
- 指定表格附加部分 (如果有的話) 的完整性處理應用程式。 如果無法滿足這類要求 (亦即,系統偵測到需要檢查整個表格的資料完整性) ,則會傳回錯誤 (SQLSTATE 55019)。
- 非漸進式
- 指定在整個表格上套用完整性處理程序。 如果表格是具體化查詢表格,則會重新計算具體化查詢表格定義。 如果表格至少定義一個限制,則此選項會導致衍生外部索引鍵表格及衍生立即具體化查詢表格的完整處理。 如果表格是暫置表格,則會設為不一致狀態。
- 強制產生
- 如果表格包括表示式直欄所產生的值,則會根據表示式來計算值,並儲存在直欄中。 如果未指定此選項,則會將現行值與表示式的計算值進行比較,就好像相等檢查限制生效一樣。 如果針對完整性漸進式處理表格,則只會針對附加部分計算產生的直欄。 當表格是系統期間時間表格時,僅當您第一次使用 DROP VERSIONING 子句發出 ALTER TABLE 陳述式 (SQLSTATE 428FH) 時,才容許 FORCE GENERATED 選項。
- 刪修
- 僅能針對暫置表格指定此選項。 指定要刪改暫置表格的內容,以及要將暫置表格設為不一致狀態。 如果 table-name 清單中有任何表格不是暫置表格,則會傳回錯誤 (SQLSTATE 428FH)。 如果也指定 INCREMENTAL 檢查選項,則會傳回錯誤 (SQLSTATE 428FH)。
- 完全存取權
- 指定在 SET INTEGRITY 陳述式執行之後,表格將變成可完全存取。
當漸進式處理呼叫清單中的基礎表格 (具有相依立即具體化查詢表格或相依立即暫置表格) 時,在 SET INTEGRITY 陳述式執行之後,基礎表格會視需要處於無資料移動狀態。 當所有漸進式可重新整理的相依立即具體化查詢表格及暫置表格離開設定完整性擱置狀態時,基礎表格會自動離開無資料移動狀態進入完整存取狀態。 如果使用 IMMEDIATE CHECKED 選項指定 FULL ACCESS 選項,則基礎表格會直接置於完整存取狀態 (略過無資料移動狀態)。 在 Db2® 9.7 版中。 Fix Pack 1 以及更新版本,指定 FULL ACCESS 選項只會移除相依表格與基礎表格之間的相依關係。 在非同步分割區分離作業完成資料分割區分離處理程序之前,基礎表格會繼續無法使用。
未重新整理的相依立即具體化查詢表格可能會在後續的 REFRESH TABLE 陳述式中進行完整重新計算,而未將表格的附加部分延伸到它們的相依立即暫置表格可能會被標示為不一致。
當呼叫清單中的基礎表格需要完整處理,或沒有相依立即具體化查詢表格或相依立即暫置表格時,不論是否指定 FULL ACCESS 選項,在 SET INTEGRITY 陳述式執行之後,基礎表格會直接進入完整存取狀態。
exception-clause - 針對異常狀況
- 指定將違反所檢查限制的任何列移至異常狀況表格。 即使偵測到錯誤,也會將表格移出設定完整性擱置狀態。 會傳回警告,指出已將一或多列移至異常狀況表格 (SQLSTATE 01603)。
如果未指定 FOR EXCEPTION 選項,且違反任何限制,則只會傳回第一個偵測到的違規 (SQLSTATE 23514)。 如果任何表格中有違規,則所有表格都會保持設定完整性擱置狀態。
在檢查限制違規時,建議一律使用 FOR EXCEPTION 選項,以防止在發現違規時回復 SET INTEGRITY 陳述式。
當 IN 關鍵字後面指定的表格是系統期間時間表格時,只有在您第一次發出具有 DROP VERSIONING 子句 (SQLSTATE 428FH) 的 ALTER TABLE 陳述式時,才容許 FOR EXCEPTION 選項。
- IN table-name
- 指定要從中移動違反限制之列的表格。 每一個要檢查的表格必須指定一個異常狀況表格。 此子句無法指定給具體化查詢表格或暫置表格 (SQLSTATE 428A7)。
- USE 表格名稱
- 指定要將錯誤列移至其中的異常狀況表格。
- STATUS 直欄中的值必須是
- 完全存取權
- 如果將 FULL ACCESS 選項指定為陳述式的唯一作業,則會將表格置於完整存取狀態,而不會重新檢查完整性違規。 不過,尚未重新整理的相依立即具體化查詢表格可能需要在後續的 REFRESH TABLE 陳述式中進行完整重新計算,而尚未有延伸表格差異部分的相依立即暫置表格可能會變更為不完整狀態。 此選項只能指定給處於無資料移動狀態或無存取狀態,但不處於設定完整性擱置狀態的表格 (SQLSTATE 428FH)。
- 刪修
- 僅能針對暫置表格指定此選項。 指定要刪改暫置表格的內容,以及要將暫置表格設為不一致狀態。 如果 table-name 清單中有任何表格不是暫置表格,則會傳回錯誤 (SQLSTATE 428FH)。 table-unchecked-options
- 完整性-選項
- 用來定義當表格脫離設定完整性擱置狀態時要略過的必要完整性處理類型。
- ALL
- 表格將立即離開設定完整性擱置狀態,而不執行任何必要的完整性處理程序。
- 外部索引鍵
- 當表格離開設定完整性擱置狀態時,將不會執行必要的外部索引鍵限制檢查。
- 檢查
- 當表格脫離設定完整性擱置狀態時,將不會執行必要的檢查限制檢查。
- 具體化查詢
- 當表格脫離設定完整性擱置狀態時,將不會執行必要的具體化查詢表格重新整理。
- 產生的直欄
- 當表格脫離設定完整性擱置狀態時,將不會執行必要的產生直欄限制檢查。
- 暫置
- 當表格脫離設定完整性擱置狀態時,將不會執行將資料傳送至暫置表格的必要作業。
在特定類型的完整性處理已標示為略過之後,如果表格上不需要其他類型的完整性處理,則會立即將表格移出設定完整性擱置狀態。
- 完全存取權
- 指定在執行 SET INTEGRITY 陳述式之後,表格將變成完全可存取。
當漸進式處理呼叫清單中的基礎表格,且它具有相依立即具體化查詢表格或相依立即暫置表格時,在 SET INTEGRITY 陳述式執行之後,會視需要將基礎表格置於無資料移動狀態。 當所有漸進式可重新整理的相依立即具體化查詢表格及暫置表格都離開設定完整性擱置狀態時,基礎表格會自動離開無資料移動狀態進入完整存取狀態。 如果使用 IMMEDIATE UNCHECKED 選項指定 FULL ACCESS 選項,則基礎表格會直接置於完整存取狀態 (它會略過無資料移動狀態)。 未重新整理的相依立即具體化查詢表格可能會在後續的 REFRESH TABLE 陳述式中進行完整重新計算,而未將表格的附加部分延伸到它們的相依立即暫置表格可能會被標示為不一致。
在 Db2 V9.7中。 Fix Pack 1 以及更新版本,指定 FULL ACCESS 選項只會移除相依表格與基礎表格之間的相依關係。 在非同步分割區分離作業完成資料分割區分離處理程序之前,基礎表格會繼續無法使用。
當呼叫清單中的基礎表格需要完整處理,或沒有相依立即具體化查詢表格或相依立即暫置表格時,不論是否已指定 FULL ACCESS 選項,在 SET INTEGRITY 陳述式執行之後,基礎表格會直接處於完整存取狀態。
如果已使用 IMMEDIATE UNCHECKED 選項指定 FULL ACCESS 選項,且陳述式不會使表格離開設定完整性擱置狀態,則會傳回錯誤 (SQLSTATE 428FH)。
- 用來定義當表格脫離設定完整性擱置狀態時要略過的必要完整性處理類型。
- 立即未檢查
- 指定下列其中一項:
- 表格將立即離開設定完整性擱置狀態,而不需要任何必要的完整性處理。
- 當後續使用 IMMEDIATE CHECKED 選項的 SET INTEGRITY 陳述式使表格脫離設定完整性擱置狀態時,表格會略過一種以上類型的必要完整性處理。
在使用此選項之前,請考量此選項的資料完整性含意。 請參閱
附註
一節。
注意事項
- 下列限制適用於集完整性檢查的 SMP 平行化:
- 依預設,不會啟用集完整性檢查的 SMP 平行化。 必須設定具有 PRLSI 選項的 DB2_EXTENDED_OPTIMIZATION 登錄變數,才能啟用它。
- CURRENT DEGREE 特別暫存器應該用來確保適當的平行化程度。
- 在 MPP 環境中不支援 SMP 平行化。
- 在連接之後,集完整性不支援 SMP 平行化。
- 當涉及下列任何項目時,不支援 SMP 平行化:
- 具體化查詢表格或暫置表格
- 身分或產生的直欄
- 當涉及多個表格參照或自我參照時,平行化將會受到限制。 限制及參照檢查最多將平行化一個表格。 具有最昂貴限制檢查的表格檢查將會是平行化的表格檢查。 不過,如果表格有多個自我參照,則其部分或全部限制檢查可能不會平行化。
- 異常狀況處理將不會平行化。
- 對處於其中一個受限集完整性相關狀態之表格的影響:
- 在處於讀取存取狀態或無存取狀態的表格上,不容許使用 INSERT、UPDATE 或 DELETE。 此外,任何陳述式若需要對處於這種狀態的表格進行這種類型的修改,將會遭到拒絕。 例如,不容許刪除母表格中的列,該列會重疊至處於無存取狀態的相依表格。
- 在處於無存取狀態的表格上不允許使用 SELECT。 此外,任何需要對處於無存取狀態之表格的讀取權的陳述式都會被拒絕。
- 通常會立即強制執行新增至表格的新限制。 不過,如果表格處於設定完整性擱置狀態,則會延遲檢查任何新的限制,直到表格脫離設定完整性擱置狀態為止。 如果表格處於設定完整性擱置狀態,則新增限制會將表格置於設定完整性擱置無存取狀態,因為資料的有效性有風險。
- CREATE INDEX 陳述式無法參照任何處於讀取存取狀態或無存取狀態的表格。 同樣地,用來新增主要索引鍵或唯一限制的 ALTER TABLE 陳述式無法參照任何處於讀取存取狀態或無存取狀態的表格。
- 不容許在處於讀取存取狀態或無存取狀態的表格上操作匯入公用程式。
- 不容許匯出公用程式對處於無存取狀態的表格執行作業,但容許對處於讀取存取狀態的表格執行作業。 如果表格處於讀取權狀態,則匯出公用程式只會匯出未附加部分的資料。
- 在處於下列任何狀態的表格上,不容許執行可能涉及表格內資料移動的作業 (例如 REORG、REDISTRIBUTE、更新配送索引鍵、更新多維度叢集索引鍵、 更新範圍叢集索引鍵、更新表格分割索引鍵等): 讀取權、無存取權或無資料移動。
- 在處於下列任何狀態的表格上,容許載入、備份、還原、更新統計資料、runstats、reorgchk、清單歷程及 RollForward 公用程式: 完整存取權、讀取權、無存取權或無資料移動。
- ALTER TABLE、COMMENT、DROP TABLE、CREATE ALIAS、CREATE TRIGGER、CREATE VIEW、GRANT、REVOKE 及 SET INTEGRITY 陳述式可以參照處於下列任何狀態的表格: 完整存取權、讀取權、無存取權或無資料移動。 不過,它們可能會導致表格進入無存取狀態。
- 在執行時期存取表格時,如果套件、視圖及任何其他物件相依於處於無存取狀態的表格,則會傳回錯誤。 在執行時期嘗試對表格執行插入、更新或刪除作業時,如果套件相依於處於讀取存取狀態的表格,則會傳回錯誤。
- 如果表格的資料庫分割鍵、表格分割鍵、多維度叢集鍵或範圍叢集鍵參照其表示式已透過 ALTER TABLE 陳述式變更的產生直欄,則無法使用 IMMEDIATE UNCHECKED 選項指定 ALL 或 GENERATED COLUMN 選項。
SET INTEGRITY 陳述式移除違規列不是刪除事件。 因此, SET INTEGRITY 陳述式絕不會啟動觸發程式。 同樣地,使用 FORCE GENERATED 選項更新產生的直欄不會啟動觸發程式。
- 使用 IMMEDIATE UNCHECKED 子句的警告:
- 此條款旨在供公用程式使用,不建議應用程式使用。 如果表格中有資料不符合定義給表格的完整性規格,且使用 IMMEDIATE UNCHECKED 選項,則可能會傳回不正確的查詢結果。將表格移出設定完整性擱置狀態而未執行必要完整性處理程序的事實會記錄在型錄中 (SYSCAT.TABLES 視圖中 CONST_CHECKED 直欄中的個別位元組會設為
U
)。 這指出使用者已承擔有關特定限制的資料完整性責任。 此值會維持不變,直到下列任一項:- 表格會回到設定完整性擱置狀態 (透過使用 OFF 選項參照 SET INTEGRITY 陳述式中的表格) ,此時 CONST_CHECKED 直欄中的
U
值會變更為W
值,指出使用者先前已承擔資料完整性的責任,而且系統需要驗證資料。 - 捨棄表格的所有未檢查限制。
W
狀態不同於N
狀態,因為它會記錄先前由使用者檢查完整性,但尚未由系統檢查的事實。 如果使用者發出 SET INTEGRITY ... 具有 NOT INCREMENTAL 選項的 IMMEDIATE CHECKED 陳述式,系統會重新檢查整個表格的資料完整性 (或對具體化查詢表格執行完整重新整理) ,然後將W
狀態變更為Y
狀態。 如果指定 IMMEDIATE UNCHECKED ,或未指定 NOT INCREMENTAL ,則W
狀態會變回U
狀態,以記錄系統仍未驗證部分資料的事實。 在後一種情況下 (未指定 NOT INCREMENTAL 時) ,會傳回警告 (SQLSTATE 01636)。如果已使用 IMMEDIATE UNCHECKED 子句檢查基礎表格的完整性,則基礎表格的 CONST_CHECKED 直欄中的U
值會延伸到下列的對應 CONST_CHECKED 直欄:- 相依立即具體化查詢表格
- 相依延遲具體化查詢表格
- 相依暫置表格
對於相依立即具體化查詢表格,每當基礎表格脫離設定完整性擱置狀態,以及每當重新整理具體化查詢表格時,即會執行此延伸。 對於相依延遲具體化查詢表格,每當重新整理具體化查詢表格時,即會執行此延伸。 對於相依暫置表格,每當基礎表格超出設定完整性擱置狀態時,即會執行此延伸。 在相依具體化查詢表格及暫置表格的 CONST_CHECKED 直欄中,這些延伸的
U
值會記錄下列事實: 這些具體化查詢表格及暫置表格相依於某些基礎表格,其必要的完整性處理已使用 IMMEDIATE UNCHECKED 選項略過。若為具體化查詢表格,在完全重新整理具體化查詢表格且其基礎表格在其對應的 CONST_CHECKED 直欄中沒有
U
值之前,將會保留基礎表格所傳播之 CONST_CHECKED 直欄中的U
值。 重新整理之後,具體化查詢表格之 CONST_CHECKED 直欄中的U
值會變更為Y
。對於暫置表格,在重新整理暫置表格的對應延遲具體化查詢表格之前,基礎表格所傳播之 CONST_CHECKED 直欄中的
U
值將會保留。 重新整理之後,暫置表格的 CONST_CHECKED 直欄中的U
值將變更為Y
。 - 表格會回到設定完整性擱置狀態 (透過使用 OFF 選項參照 SET INTEGRITY 陳述式中的表格) ,此時 CONST_CHECKED 直欄中的
- 如果使用 IMMEDIATE CHECKED 選項在相同的 SET INTEGRITY 陳述式中檢查子表格及其母表格,且母表格需要完整檢查其限制項,則子表格將會檢查其外部索引鍵限制項,而不管子表格在 CONST_CHECKED 直欄中是否有外部索引鍵限制項的
U
值。
- 此條款旨在供公用程式使用,不建議應用程式使用。 如果表格中有資料不符合定義給表格的完整性規格,且使用 IMMEDIATE UNCHECKED 選項,則可能會傳回不正確的查詢結果。
- 如果表格已進行資料分割,且有要維護的未分割索引 (XML 直欄路徑索引除外) ,則指定單一目標表格時的 IMMEDIATE UNCHECKED 行為與具有 ALLOW WRITE ACCESS 選項的 IMMEDIATE CHECKED 行為相同: 會執行所有完整性處理,並傳回任何產生的錯誤。 如果陳述式參照多個目標表格,則會傳回錯誤 (SQLSTATE 428FH)。
- 使用 LOAD INSERT 或 ALTER TABLE ATTACH 附加資料之後,具有 IMMEDIATE CHECKED 選項的 SET INTEGRITY 陳述式會檢查表格是否有限制違規。 系統決定是否可以在表格上進行漸進式處理。 如果是的話,只會檢查附加的部分是否有完整性違規。 如果沒有,系統會檢查整個表格是否有完整性違規。
- 請考量下列陳述式:
在下列實務範例中,如果 T 是具體化查詢表格 (MQT) 或暫置表格 --- ,則不支援 T 的 INCREMENTAL 檢查選項,也不支援 T --- 的漸進式重新整理:SET INTEGRITY FOR T IMMEDIATE CHECKED- 當 T 處於設定完整性擱置狀態時,已將新的限制新增至 T
- 對 T 執行 LOAD REPLACE 作業時,它會產生母項或其基礎表格
- 在 T、其母項或其基礎表格上的前次完整性檢查之後啟動 NOT LOGGED INITIALLY WITH EMPTY TABLE 選項時
- 已檢查 T 的任何母項 (或基礎表格,如果 T 是具體化查詢表格或暫置表格) 的完整性非漸進式時,完整處理的重疊效果
- 如果包含表格或其母項 (或具體化查詢表格或暫置表格的基礎表格) 的表格空間已 RollForward 至復原點,且表格及其母項 (或基礎表格 (如果表格是具體化查詢表格或暫置表格)) 位於不同的表格空間中
- T 是 MQT ,且在前次重新整理之後,已直接對 T 執行 LOAD REPLACE 或 LOAD INSERT 作業
- 只要狀況允許,就會使用增量處理,因為它更有效率。 在大部分情況下,不需要 INCREMENTAL 選項。 不過,必須確保確實以漸進方式處理完整性檢查。 如果系統偵測到需要完整處理以確保資料完整性,則會傳回錯誤 (SQLSTATE 55019)。
- 如果未滿足前一個項目符號中說明的完整處理條件,則當使用者未針對陳述式
SET INTEGRITY FOR T IMMEDIATE CHECKED指定 NOT INCREMENTAL 選項時,系統將嘗試僅檢查附加部分的完整性,或執行漸進式重新整理 (如果它是具體化查詢表格)。 - 如果在完整性處理期間發生錯誤,則會回復處理的所有效果 (包括從原始表格中刪除及插入異常狀況表格中)。
- 如果使用 FORCE GENERATED 選項發出的 SET INTEGRITY 陳述式因缺少日誌空間而失敗,請增加可用的作用中日誌空間,然後重新發出 SET INTEGRITY 陳述式。 或者,搭配使用 SET INTEGRITY 陳述式與 GENERATED COLUMN 及 IMMEDIATE UNCHECKED 選項,以略過表格的產生直欄檢查。 然後,發出具有 IMMEDIATE CHECKED 選項且不含 FORCE GENERATED 選項的 SET INTEGRITY 陳述式,以檢查表格是否有其他完整性違規 (如果適用的話) ,並讓它離開設定完整性擱置狀態。 在表格超出設定完整性擱置狀態之後,可以透過將產生的直欄指派給 UPDATE 陳述式中的關鍵字 DEFAULT ,將它們更新為其預設 (產生的) 值。 這是透過使用多個基於範圍的搜尋更新陳述式 (每一個後面接著一個確定) ,或使用游標型方法 (使用間歇性確定) 來達成。 如果在使用游標型方法間歇性確定之後要保留鎖定,則應該使用
具有保留
游標。 - 使用 SET INTEGRITY 陳述式或 LOAD 指令的 CASCADE DEFERRED 選項,或透過具有 ATTACH 子句的 ALTER TABLE 陳述式,進入設定完整性擱置狀態,且使用 SET INTEGRITY 陳述式的 IMMEDIATE CHECKED 選項來檢查完整性違規的表格,將具有其後代外部索引鍵表格、後代立即具體化查詢表格,以及後代立即暫置表格,視需要置於設定完整性擱置狀態:
- 如果檢查整個表格是否有完整性違規,則會將其衍生外部索引鍵表格、衍生立即具體化查詢表格及衍生立即暫置表格置於設定完整性擱置狀態。
- 如果漸進式檢查表格是否有完整性違規,則其衍生立即具體化查詢表格和暫置表格會進入設定完整性擱置狀態,且其衍生外部索引鍵表格會維持其原始狀態。
- 如果表格完全不需要檢查,則其衍生立即具體化查詢表格、衍生暫置表格及衍生外部索引鍵表格將保持其原始狀態。
- 使用 CASCADE DEFERRED 選項 (SET INTEGRITY 陳述式或 LOAD 指令) 進入設定完整性擱置狀態,且使用 SET INTEGRITY 陳述式的 IMMEDIATE UNCHECKED 選項帶出設定完整性擱置狀態的表格,將具有其衍生外部索引鍵表格、衍生立即具體化查詢表格,以及依需要進入設定完整性擱置狀態的衍生立即暫置表格:
- 如果已使用 REPLACE 模式載入表格,則會將其衍生外部索引鍵表格、衍生立即具體化查詢表格及衍生立即暫置表格置於設定完整性擱置狀態。
- 如果已使用 INSERT 模式載入表格,則其衍生立即具體化查詢表格及暫置表格將置於設定完整性擱置狀態,且其衍生外部索引鍵表格將保持其原始狀態。
- 如果尚未載入表格,則其衍生立即具體化查詢表格、衍生暫置表格及其衍生外部索引鍵表格將維持其原始狀態。
- SET INTEGRITY 通常是長時間執行的陳述式。 有鑑於此,若要減少因鎖定逾時而回復整個陳述式的風險,您可以在執行 SET INTEGRITY 陳述式之前發出具有 WAIT 選項的 SET CURRENT LOCK TIMEOUT 陳述式,然後在交易確定之後將特別暫存器重設為其先前的值。 不過請注意, CURRENT LOCK TIMEOUT 特別暫存器只會影響一組特定的鎖定類型。
- 如果您使用 ALLOW QUERY OPTIMIZATION USING REFRESH DEFERRED TABLES WITH REFRESH AGE ANY 選項,請確定 REFRESH DEFERRED 具體化查詢表格的維護順序正確。 例如,請考量兩個具體化查詢表格 MQT1 及 MQT2,其具體化查詢會共用相同的基礎表格。 MQT2 的具體化查詢可以使用 MQT1而非基礎表格來計算。 如果使用個別陳述式來維護這兩個具體化查詢表格,且先維護 MQT2 ,系統可能會選擇使用尚未維護的 MQT1內容來維護 MQT2。 在此情況下, MQT1 會包含現行資料,但 MQT2 仍可能包含過時資料,即使兩者幾乎同時維護。 如果使用兩個 SET INTEGRITY 陳述式而非一個 SET INTEGRITY 陳述式,則正確的維護順序是先維護 MQT1 。
- 使用 SET INTEGRITY 陳述式對已載入或連接的基本表格執行完整性處理時,建議您在相同的 SET INTEGRITY 陳述式中處理其相依 REFRESH IMMEDIATE 具體化查詢表格及其 PROPAGATE IMMEDIATE 暫置表格,以避免在 SET INTEGRITY 處理結束時將這些相依表格置於設定完整性擱置無存取狀態。 請注意,對於具有大量相依 REFRESH IMMEDIATE 具體化查詢表格及 PROPAGATE IMMEDIATE 暫置表格的基本表格,記憶體限制可能導致無法處理與基本表格相同陳述式中的所有相依項。
- 如果指定 FORCE GENERATED 或 GENERATE IDENTITY 選項,且產生的直欄是唯一索引的一部分,則 SET INTEGRITY 陳述式會傳回錯誤 (SQLSTATE 23505) ,並在唯一索引中偵測到重複索引鍵時回復。 即使正在處理的表格有異常狀況表格,也會傳回此錯誤。在下列情況下,可能會發生此情況:
- SET INTEGRITY 陳述式在對表格執行 LOAD 指令之後執行,並在載入作業期間指定 GENERATEDOVERRIDE 或 IDENTITYOVERRIDE 檔案類型修飾元。 若要防止此情況,建議您使用 GENERATEDIGNORE 或 GENERATEDMISSING 檔案類型修飾元而非 GENERATEDOVERRIDE ,並使用 IDENTITYIGNORE 或 IDENTITYMISSING 修飾元而非 IDENTITYOVERRIDE。 使用建議的修飾元將在 SET INTEGRITY 陳述式執行期間,避免需要由表示式直欄或身分直欄處理所產生的任何需求。
- SET INTEGRITY 陳述式在 ALTER TABLE 陳述式變更表示式直欄所產生的表示式之後執行。
在遇到這類實務範例之後,如果要讓表格離開設定完整性擱置狀態,請執行下列動作:- 請勿使用 FORCE GENERATED 或 GENERATE IDENTITY 選項來重新產生直欄值。 相反地,請將 IMMEDIATE CHECKED 選項與 FOR EXCEPTION 選項一起使用,以將違反所產生直欄表示式的任何列移至異常狀況表格。 然後,從異常狀況表格重新將列插入表格中,這會產生正確的表示式並執行唯一索引鍵檢查。 這可避免必須重新處理整個表格,因為只需要重新處理違反所產生直欄表示式的那些列。
- 如果正在處理的表格具有附加的分割區,請先分離那些分割區,然後再執行前一個項目符號中說明的動作。 然後,重新連接分割區並執行 SET INTEGRITY 陳述式,以個別處理所連接分割區上的完整性。
- 如果針對 SET INTEGRITY 陳述式及異常狀況表格指定受保護表格,則必須符合下列所有表格準則; 否則會傳回錯誤 (SQLSTATE 428A5):
- 表格必須受到相同的安全原則保護。
- 如果受保護表格中的直欄具有資料類型 DB2SECURITYLABEL,則異常狀況表格中的對應直欄也必須具有資料類型 DB2SECURITYLABEL。
- 如果受保護表格中的直欄受到安全標籤保護,則異常表格中的對應直欄也必須受到相同安全標籤的保護。
- 違反系統期間時間表格中所檢查之完整性的橫列,無法移至異常狀況表格。 如果必須將違規列移至異常狀況表格,則在發出具有 FOR EXCEPTION 子句的 SET INTEGRITY 陳述式之前,必須變更表格以捨棄版本化。
- 替代語法: 基於與舊版 Db2 及其他資料庫產品的相容性,支援下列各項。 這些替代方案是非標準的,不應該使用。
- 可以指定 SET CONSTRAINTS 來取代 SET INTEGRITY
- 可以指定 SUMMARY 來取代 MATERIALIZED QUERY
範例
- 範例 1: 下列查詢範例提供表格的設定完整性擱置狀態及設定完整性相關存取限制狀態的相關資訊。 SUBSTR 是用來擷取 SYSCAT.TABLES 的 CONST_CHECKED 直欄的個別位元組數。 第一個位元組代表外部索引鍵限制; 第二個位元組代表核對限制; 第五個位元組代表具體化查詢表格完整性; 第六個位元組代表產生的直欄限制; 第七個位元組代表暫置表格完整性; 第八個位元組代表資料分割限制。 STATUS 提供設定完整性擱置狀態, ACCESS_MODE 提供設定完整性相關存取限制狀態。
SELECT TABNAME, STATUS, ACCESS_MODE, SUBSTR(CONST_CHECKED,1,1) AS FK_CHECKED, SUBSTR(CONST_CHECKED,2,1) AS CC_CHECKED, SUBSTR(CONST_CHECKED,5,1) AS MQT_CHECKED, SUBSTR(CONST_CHECKED,6,1) AS GC_CHECKED, SUBSTR(CONST_CHECKED,7,1) AS STG_CHECKED, SUBSTR(CONST_CHECKED,8,1) AS DP_CHECKED FROM SYSCAT.TABLES - 範例 2: 將 PARENT 表格置於設定完整性擱置無存取狀態,並立即將設定完整性擱置狀態重疊顯示至其後代。
SET INTEGRITY FOR PARENT OFF NO ACCESS CASCADE IMMEDIATE - 範例 3: 將母項表格置於設定完整性擱置讀取存取狀態,而不將設定完整性擱置狀態立即重疊顯示到其後代。
SET INTEGRITY FOR PARENT OFF READ ACCESS CASCADE DEFERRED - 範例 4: 檢查名稱為 FACT_TABLE 之表格的完整性。 如果未偵測到任何完整性違規,則會使表格離開設定完整性擱置狀態。 如果偵測到任何完整性違規,則會回復整個陳述式,且表格會保持處於設定完整性擱置狀態。
SET INTEGRITY FOR FACT_TABLE IMMEDIATE CHECKED - 範例 5: 檢查 SALES 及 PRODUCTS 表格的完整性,並將違反完整性的列移至名為 SALES_EXCEPTIONS 及 PRODUCTS_EXCEPTIONS 的異常狀況表格。 不論是否有任何完整性違規, SALES 及 PRODUCTS 表格都會離開設定完整性擱置狀態。
SET INTEGRITY FOR SALES, PRODUCTS IMMEDIATE CHECKED FOR EXCEPTION IN SALES USE SALES_EXCEPTIONS, IN PRODUCTS USE PRODUCTS_EXCEPTIONS - 範例 6: 使用 IMMEDIATE UNCHECKED 選項來略過 MANAGER 表格中的 FOREIGN KEY 限制檢查及 EMPLOYEE 表格中的 CHECK 限制檢查。
SET INTEGRITY FOR MANAGER FOREIGN KEY, EMPLOYEE CHECK IMMEDIATE UNCHECKED - 範例 7: 使用兩個 ALTER TABLE 陳述式,將核對限制及外部索引鍵新增至 EMP_ACT 表格。 使用具有 OFF 選項的 SET INTEGRITY 陳述式,將表格置於設定完整性擱置狀態,以便在執行兩個 ALTER TABLE 陳述式時不會立即檢查限制。 具有 IMMEDIATE CHECKED 選項的單一 SET INTEGRITY 陳述式用於在單一通過表格期間,檢查兩個新增的限制。
SET INTEGRITY FOR EMP_ACT OFF; ALTER TABLE EMP_ACT ADD CHECK (EMSTDATE <= EMENDATE); ALTER TABLE EMP_ACT ADD FOREIGN KEY (EMPNO) REFERENCES EMPLOYEE; SET INTEGRITY FOR EMP_ACT IMMEDIATE CHECKED FOR EXCEPTION IN EMP_ACT USE EMP_ACT_EXCEPTIONS - 範例 8: 以正確的值更新產生的直欄。
SET INTEGRITY FOR SALES IMMEDIATE CHECKED FORCE GENERATED - 範例 9: 將不同來源的 LOAD INSERT 附加至 REFRESH IMMEDIATE 具體化查詢表格 (SALES_SUMMARY) 的基礎表格 (SALES)。 漸進式檢查 SALES 的資料完整性,並漸進式重新整理 SALES_SUMMARY。 在此實務範例中, SALES 的完整性檢查及 SALES_SUMMARY 的重新整理是漸進式的,因為系統會選擇漸進式處理。 在 SALES 表格上使用 ALLOW READ ACCESS 選項,以在進行表格載入部分的完整性檢查時容許並行讀取現有資料。
LOAD FROM 2000_DATA.DEL OF DEL INSERT INTO SALES ALLOW READ ACCESS; LOAD FROM 2001_DATA.DEL OF DEL INSERT INTO SALES ALLOW READ ACCESS; SET INTEGRITY FOR SALES ALLOW READ ACCESS IMMEDIATE CHECKED FOR EXCEPTION IN SALES USE SALES_EXCEPTIONS; REFRESH TABLE SALES_SUMMARY; - 範例 10: 將新分割區附加至名為 SALES 的資料分割表格。 漸進式檢查 SALES 表格附加資料中的限制違規,並漸進式重新整理相依 SALES_SUMMARY 表格。 在兩個表格上都使用 ALLOW WRITE ACCESS 選項,以在進行完整性檢查時容許並行更新。
ALTER TABLE SALES ATTACH PARTITION STARTING (100) ENDING (200) FROM SOURCE; SET INTEGRITY FOR SALES ALLOW WRITE ACCESS, SALES_SUMMARY ALLOW WRITE ACCESS IMMEDIATE CHECKED FOR EXCEPTION IN SALES USE SALES_EXCEPTIONS; - 範例 11: 從名為 SALES 的資料分割表格中分離分割區。 漸進式重新整理相依 SALES_SUMMARY 表格。
ALTER TABLE SALES DETACH PARTITION 2000_PART INTO ARCHIVE_TABLE; SET INTEGRITY FOR SALES_SUMMARY IMMEDIATE CHECKED; - 範例 12: 從設定完整性擱置狀態中取出新的使用者維護具體化查詢表格。
CREATE TABLE YEARLY_SALES AS (SELECT YEAR, SUM(SALES)AS SALES FROM FACT_TABLE GROUP BY YEAR) DATA INITIALLY DEFERRED REFRESH DEFERRED MAINTAINED BY USER SET INTEGRITY FOR YEARLY_SALES ALL IMMEDIATE UNCHECKED - 範例 13: 將新分割區附加至名為 SALES 的資料分割表格。 假設此表格沒有未分割的使用者索引。 同時假設資料完整性檢查 (包括範圍驗證及其他限制檢查) 已完成 (透過與資料伺服器無關的應用程式邏輯)。 使用 SET INTEGRITY 來最佳化資料轉入處理程序 ... 用來跳過範圍及限制違規檢查的所有 IMMEDIATE UNCHECKED 陳述式。
SALES 表格已脫離 SET INTEGRITY 擱置狀態,且新的資料可供應用程式立即使用。ALTER TABLE SALES ATTACH PARTITION STARTING (300) ENDING (400) FROM SOURCE_TABLE; SET INTEGRITY FOR SALES ALL IMMEDIATE UNCHECKED; - 範例 14: 使用 PRLSI INCR 選項來設定 DB2_EXTENDED_OPTIMIZATION 登錄變數是透過執行下列指令來完成:
db2set DB2_EXTENDED_OPTIMIZATION='PRLSI INCR'
