2017-08-07 79 views
0

這裏是我想怎樣做:PostgreSQL的功能外鍵

create table stuff 
    (some_key varchar primary key, 
    some_data varchar) 
; 

create table obfuscated_stuff 
    (some_key_sha1 varchar references digest(stuff (some_key), 'sha1'), 
    other_data varchar) 
; 

換句話說,我想建立一個外鍵基於一個單向散列另一個表,而不必將該散列放在原始表中。

這是一項政策/法規要求。我可以構建沒有FK約束的「obfuscated_stuff」表,但我寧願在那裏。

它不允許在FK約束中使用函數。我也不能做一個FK的視圖(可能有它的功能)。還有其他建議嗎?

+0

最終目標是什麼。你能否隱藏一個ID然後在後臺加入表格?什麼是混淆的東西的目的?通常這樣的東西更好地完成權限和良好的後端工程。 –

+0

決策者不希望我們明確地加入兩個數據集。我們已經在父表上鎖定了相關的列級權限。將數據插入到子表中的過程需要引用回父表中的行。如果可以的話,我寧願包含一個確保引用有效的約束。 – rotten

+0

當將'some_key_sha1'插入混淆的子表時,您知道'some_key'嗎? –

回答

1

根據當前的documentation你不能這樣做。只允許一列或一組列名稱。

你是對的,你不能在視圖上製作FK。物化視圖也是如此。

您可以在引用列的BEFORE INSERT/UPDATE上編寫觸發器,該引用檢查引用的索引列。違反時,返回NULL或異常。在引用表的PK中,你甚至可以用散列值創建一個索引。

+0

謝謝。沒有想到強制約束的觸發器。我會考慮的。有趣的想法。 – rotten