【问题标题】:Accessing users table in different database (multi-tenant)访问不同数据库中的用户表(多租户)
【发布时间】:2018-07-04 04:03:12
【问题描述】:

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

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

【问题讨论】:

  • 外键引用在不同的架构中是不可能的。但是,您可以在来自不同模式的表中应用联接。要从任何模式访问数据,您只需要使用schema.table_name 之类的模式名称更新查询。只需确保用户对这两种模式都有权限。
  • 您好 Kamal,但是 join 语句对我有什么帮助?我想用代理数据库中的用户键表保存组织数据库表中的记录。
  • 我添加了一个详细的答案。希望对您有所帮助。

标签: sql sql-server database-design


【解决方案1】:

正如前面评论中提到的(用数据库替换单词模式,因为您有单独的数据库),在不同的数据库中不可能引用外键。但是,您可以在来自不同数据库的表中应用联接。要访问任何数据库中的数据,您只需要使用database.table_name 之类的数据库名称更新查询。只需确保用户对这两个数据库都有权限。

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

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

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);

希望对你有帮助!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多