如何在多租户数据库中使字段为NOT NULL

时间:2016-11-29 02:05:22

标签: sql sql-server oracle postgresql

这是一个多租户应用。所有记录都有一个客户端ID来分隔客户端数据。客户可以在此表中插入自己的数据,并将自己的字段设置为可空或非空。因此,将整个字段设置为null将不起作用。我需要为特定的客户端ID设置一个null字段。

我目前正在查询数据库以检查该值是否为null。在INSERT上我检查插入值是否为null如果是这样我抛出一个错误。我希望数据库能够进行所有这些检查。在这样的多租户数据库中这是可能的吗?

另外,我需要有关SQL Server,oracle和postgresql的建议。感谢

2 个答案:

答案 0 :(得分: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'但对于列#foo'有不同的定义。包括非空约束。另请注意,我使用了检查约束来确保只有客户端1的记录可以进入此表。

要使其正常工作,您的应用程序必须更新才能将客户端记录插入到正确的表中,否则您需要编写一个自动执行此操作的触发器。有关如何执行此操作的示例,请参阅partitioning上的手册部分。

您的应用程序仍然可以对父表进行查询(来自我的示例)并获取所有客户端的记录,包括子表中的任何客户端。

答案 1 :(得分:-1)

您将无法使用列约束执行此操作。认为你将不得不write a trigger