Sql 如何使多租户数据库中的字段不为NULL

Sql 如何使多租户数据库中的字段不为NULL,sql,sql-server,oracle,postgresql,Sql,Sql Server,Oracle,Postgresql,这是一个多租户应用程序。所有记录都有一个客户端id来分隔客户端数据。客户可以在此表中插入自己的数据,并将自己的字段设置为空或不为空。因此,将整个字段设置为非null将不起作用。我需要为特定的客户端id设置一个字段null 我目前正在查询数据库,以检查该值是否为null。在插入时,我检查插入值是否为空,如果是,我抛出一个错误。我想让数据库做所有这些检查。在这样的多租户数据库中,这可能吗 另外,我需要对SQL Server、oracle和postgresql的建议。谢谢使用列约束将无法执行此操作。我

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

我目前正在查询数据库,以检查该值是否为null。在插入时,我检查插入值是否为空,如果是,我抛出一个错误。我想让数据库做所有这些检查。在这样的多租户数据库中,这可能吗


另外,我需要对SQL Server、oracle和postgresql的建议。谢谢

使用列约束将无法执行此操作。我想你必须这么做

使用Postgresql,您至少可以使用

您可以为此特定客户机定义一个包含所需约束的继承表

考虑以下示例:

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”有不同的定义,包括NOTNULL约束。还要注意,我使用了检查约束来确保只有客户机1的记录才能进入这个表

要使其工作,要么必须更新应用程序以将客户端记录插入正确的表中,要么需要编写一个自动执行此操作的触发器。有关如何执行此操作的示例,请参见手册中的


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

如果用户使用函数写入数据库,您可以简单地编写子函数来检查输入的数据
是否为空
三个不同的数据库需要什么代码?@GordonLinoff我们有些客户使用SQL Server,有些客户使用Oracle。我需要postgresql,以防我们的客户使用postgresql。我们只支持这3个数据库。这似乎与您最近的一个问题密切相关-。您可以对这两个问题使用类似的方法。SQL表没有字段;他们有专栏。列在多租户数据库中的租户之间共享。因此,客户机可以“将自己的[columns]设置为空或不为空”的概念在列方面显然没有意义。CHECK()约束按行操作,但不容易缩放。存储过程的统一接口层可以实现任意逻辑,但您必须维护三种不同的实现。您是如何决定使用共享表(“共享一切”)而不是每个租户一个数据库或每个租户一个模式的?您是说他应该为每个租户创建一个后代表吗?若有太多不同的配置,我认为这个解决方案是行不通的。@FLICKER当然它将取决于有多少客户机以及有多少客户机需要不同的列约束,但您当然可以有数百个子表。我有这样一个系统,它运行良好。