这是一个多租户应用。所有记录都有一个客户端ID来分隔客户端数据。客户可以在此表中插入自己的数据,并将自己的字段设置为可空或非空。因此,将整个字段设置为null将不起作用。我需要为特定的客户端ID设置一个null字段。
我目前正在查询数据库以检查该值是否为null。在INSERT上我检查插入值是否为null如果是这样我抛出一个错误。我希望数据库能够进行所有这些检查。在这样的多租户数据库中这是可能的吗?
另外,我需要有关SQL Server,oracle和postgresql的建议。感谢
答案 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。