2016-11-29 89 views
1

這是穆蒂租戶應用NOT NULL。所有記錄都有一個客戶端ID來分隔客戶端數據。客戶可以在此表中插入他們自己的數據,並將其自己的字段設置爲空或不爲空。因此,將整個字段設置爲非空將不起作用。我需要爲特定的客戶端ID設置一個空字段。如何使一個外地在多租戶數據庫

我目前查詢數據庫來檢查值爲null。在插入我檢查插入值是否爲空,如果是這樣我拋出一個錯誤。我希望數據庫能夠完成所有這些檢查。這是否可以在這樣的多租戶數據庫中使用?

另外,我需要SQL Server,oracle和postgresql的建議。由於

+0

如果用戶正在使用函數寫入數據庫,您可以簡單地編寫子函數來檢查數據是否輸入'IS NULL' –

+0

您需要爲三個不同的數據庫編寫代碼? –

+0

@GordonLinoff我們有一些客戶使用SQL Server,有些使用Oracle。我需要postgresql,以防我們得到一個postgresql的客戶。我們只支持這3個數據庫。 – Luke101

回答

-1

您將無法使用列約束來做到這一點。認爲你將不得不write a trigger

0

有了Postgresql,至少你可以用table inheritance來做到這一點。

您可以爲包含所需約束的特定客戶端定義一個繼承表。

考慮下面的例子:

psql=> CREATE TABLE a(client INT NOT NULL, id SERIAL, foo TEXT); 
CREATE TABLE 

psql=> CREATE TABLE b(foo TEXT NOT NULL, CHECK (CLIENT=1)) INHERITS (a); 
NOTICE: moving and merging column "foo" with inherited definition 
DETAIL: User-specified column moved to the position of the inherited column. 
CREATE TABLE 

psql=> INSERT INTO b(client,foo) VALUES (1,'a'); 
INSERT 0 1 

psql=> INSERT INTO b(client,foo) VALUES (1,NULL); 
ERROR: null value in column "foo" violates not-null constraint 
DETAIL: Failing row contains (1, 2, null). 

表「B」在這種情況下,從「A」,但沒有列「富」包括一個非空約束了不同的定義繼承。另請注意,我使用了檢查約束來確保只有客戶端1的記錄可以進入此表。

要做到這一點,要麼必須更新應用程序才能將客戶端記錄插入到正確的表中,要麼需要編寫一個自動執行該操作的觸發器。如何做到這一點的例子在partitioning的手冊部分給出。

您的應用程序仍然可以對父表(我的示例中的'a')進行查詢並獲取所有客戶端的記錄,包括子表中的任何客戶端。

+0

你是說他應該創建一個後代表對每個租戶?如果配置的種類太多,我認爲這種解決方案將無法工作。 – FLICKER

+0

@FLICKER當然這將取決於有多少客戶有多少需要不同的列約束,但你肯定可以有上百個孩子的表。我有這樣一個系統,它表現良好。 – harmic

相關問題