2016-11-29 2 views
1

これはmuti-tenantアプリケーションです。すべてのレコードには、クライアントデータを分離するためのクライアントIDがあります。顧客はこのテーブルに独自のデータを挿入して、独自のフィールドをnullまたはnullに設定することができます。したがって、ヌルでないフィールド全体を設定することはできません。私は特定のクライアントIDのフィールドをnullに設定する必要があります。マルチテナントデータベースでNOT NULLフィールドを作成する方法

現在、データベースに照会して、値がnullであるかどうかを確認しています。 INSERTでは、挿入する値がnullの場合はエラーをスローします。私はこれらのすべてのチェックを行うデータベースをしたいと思います。このようなマルチテナントデータベースでこれが可能ですか?

また、SQL Server、oracle、postgresqlの提案が必要です。ありがとう

+0

ユーザーがDBに書き込む関数を使用している場合、データが 'IS NULL'と入力されているかどうかを確認するサブ関数を書くことができます –

+0

3つの異なるデータベースにはどのようなコードが必要ですか? –

+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」は 'から継承するが、非NULL制約を含む列「FOO」の異なる定義を有します。また、チェック制約を使用して、クライアント1のレコードのみがこのテーブルに入ることを確認しました。

これを行うには、アプリケーションを更新してクライアントレコードを正しい表に挿入するか、自動的にそれを実行するトリガーを作成する必要があります。それを行う方法の例は、partitioningのマニュアルのセクションで与えられています。

あなたのアプリケーションは、親テーブル(私の例では 'a')に対してクエリを行い、すべてのクライアント(子テーブル内のすべてを含む)のレコードを取得できます。

+0

テナントごとに子孫のテーブルを作成するべきだと言っていますか?設定の種類が多すぎる場合は、この解決策は動作しないと思います。 – FLICKER

+0

@FLICKERはもちろん、そこに存在するクライアントの数と列の制約が異なる必要がありますが、確かに何百もの子テーブルを持つことができます。私はそのようなシステムを持ち、それはうまくいく。 – harmic

関連する問題