访问不同数据库中的用户表(多租户)

时间:2018-01-25 00:28:54

标签: sql sql-server database-design

我的应用程序拥有不同级别的用户,管理员用户和组织用户。

管理员用户存储在代理数据库中,并且由于每个组织都是不同的数据库,因此组织用户存储在他们自己的数据库中。 我在组织数据库中有一个表,我希望在每个组织数据库中使用代理用户表中的用户ID作为外键。 我怎样才能创建这两个表之间的关系,即使它们位于不同的dbs中?

1 个答案:

答案 0 :(得分:0)

如前面的评论中所述(由于您拥有单独的数据库,因此将模式替换为数据库),在不同的数据库中无法使用外键引用。但是,您可以在不同数据库的表中应用连接。要从任何数据库访问数据,您只需使用database.table_name等数据库名称更新查询。只需确保用户拥有两个数据库的权限。

您将无法在数据库级别维护外键约束,但您可以创建一个列,该列将引用列的值存储在另一个数据库中(仅存储未实际引用的值)。稍后检索时使用此列进行连接。这是一个例子:

假设有2个数据库organizationbroker。用户some_user_name拥有两个数据库的权限。让我们在users数据库中创建一个表broker

CREATE TABLE "users" (
    "user_id" INT NULL,
    "user_name" VARCHAR(50) NULL
);

插入虚拟记录:

INSERT INTO users (user_id, user_name) values (1, 'Kamal');

现在,让我们在organization数据库中创建表格:

CREATE TABLE "app_log" (
    "log_id" INT NULL,
    "log_message" VARCHAR(100) NULL,
    "user_id" INT NULL,
    "log_date" DATETIME NULL
);

插入虚拟记录:

INSERT INTO app_log ("log_id", "log_message", "user_id", "log_date") VALUES ('1', 'sample log message', '1', '2018-01-26T06:50:48.000');

现在,我们可以在user_id列上使用联接查询:

SELECT u.user_name, l.log_message
FROM broker.users u INNER JOIN organization.app_log l ON u.user_id = l.user_id
WHERE l.log_date >= CONVERT(DATETIME, '2018-01-26', 102);

希望这可以帮助你!!