簡體   English   中英

具有動態列的Select語句中的DB2 SQL Scubbing數據

[英]DB2 SQL Scubbing Data in a Select Statement with dynamic columns

當然,我們有一台使用DB2的AS400,我需要將客戶數據復制到新位置進行分析,但是必須對其進行清理以保護敏感信息。 我用大約30-40張桌子來做這個。 存儲的過程越來越大…

無論如何,舉一個簡單的例子,說列的數據看起來像這樣,在第二行中,是復制數據的結果:

Col1 | Col2 | Name                  | Sex |  SS#      | Age | Col7 | Col8 |
______________________________________________________________________________________________
 *   |  *   | Case when Sex = F,    |  *  | 111111111 |  *  |  *   |  *   |
            | then Jane Doe else    |
            | John Smith end        |

我的第一個嘗試是進行大量插入然后更新,例如:

Insert into New_Table (Select * from Old_Table) ;
Update New_Table 
    set Name = ( Case when Sex = ‘F’ then ‘Jane Doe’ else ‘John Smith’  End),
        SS# = 111111111 ;

問題在於,在一百萬行,200列和表上的觸發器上,insert語句速度很快,但更新速度卻非常緩慢(以小時為單位)。 因此,在Stack的幫助下,我嘗試了以下操作:

Insert into New_Table (Select Col1, Col2, 
    (Case when Sex = ‘F’ then ‘Jane Doe’ else ‘John Smith’ End), 
    Sex, 111111111, Age, Col7, Col8)

像冠軍一樣工作-感謝團隊堆棧!!

現在,我有另一個問題。 我有一個討厭將代碼列添加到這些表的開發人員的習慣,但我不在他們的團隊中。 這些表有200列,當我遇到錯誤時,當我不得不查找新列時,修改可能會很有趣

因此,我試圖提出一種方法來動態構建SQL語句並執行它,以便使列靈活。 當然,它將在語句中增加第二秒鍾來構建它,但是與發生錯誤的工作時間相比,這是值得的。

我正在考慮使用類似列查找的方法,然后將其替換為我想要的列,構建SQL語句,然后執行一個Exec來調用它。 我只是想不出該怎么做。 至於構建語句,與查詢的運行時間相比可能要花費一些時間。 例如,我可以使用以下方法拉列:

Select COLUMN_NAME from Sysibm.columns where tbname = 'old_table' AND table_schema = ‘MySchema’.

也許我可以將其放入變量中,然后搜索我知道的列(名稱,ss#)並替換它們,然后構建一個SQL語句並執行它? 上面的列的select語句的結果雖然不太適合我需要的逗號分隔列表。 據我所知。

有人在想嗎?

提前致謝。

這個:
Insert into New_Table (Select * from Old_Table)

生產代碼中絕不是一個好主意。 您應該始終明確列出所需的列。

Insert into 
New_Table (Col1, Col2, Name, Sex, SS#, Age, Col7, Col8)
(Select Col1, Col2, 
    (Case when Sex = ‘F’ then ‘Jane Doe’ else ‘John Smith’ End), 
    Sex, 111111111, Age, Col7, Col8)

添加到表中的任何新列均應具有適當的默認值。 現在,添加列時您的過程不會中斷。

當然,清理后的數據將具有新列的默認值,這可能會或可能不會出現問題。 因此,復制數據是一個事實,它證明了在生產中永遠不要使用SELECT *的規則。

您使用syscolumns的想法很不錯,還有List Fields(QUSLFLD)API 您將必須一次循環建立一列以逗號分隔的列表。

如果是我,我會建立兩個列表。 一種用於我不需要擦洗的列,一種用於要擦洗的列。 同時,您構建替換選擇文本。 這將使您的語句像這樣構建:

wSQL = 'insert into new_table (' + wNonSrub + ',' + wSrub + ')'
        + ' (select ' + wNonScub + ',' + wReplacement 
        + ' from old_table' + ')';

另一個可能的想法...在應該具有清理后的數據的表上插入一個在Insert / Update之前的觸發器。 該觸發器可以在將數據寫入表之前清除數據。 老實說,我最喜歡這個主意。 即使有人手動復制數據而不使用您正在構建的過程,也可以確保清除數據。

加快AS400上的插入速度 您可能在要插入記錄的表上建立了許多邏輯文件。 將這些邏輯文件更改為REBLD(* DELAY)

CHGLF   mylib/mylogicalfile   rebld(*delay)

唯一的副作用是第一人稱,並且在任何給定的一天中只有第一個打開文件的人可能需要等待幾秒鍾,才能重建訪問路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM