2016-11-29 78 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

相关问题