【问题标题】:Mysql Cross Schema Queries Based on Row DataMysql 基于行数据的跨模式查询
【发布时间】:2010-12-09 13:23:42
【问题描述】:

所以我正在开发一个 Web 应用程序,我们的客户希望他们的用户数据与其他客户的用户数据分开。由于我们的客户端可以相互协作,我们不能只为每个客户端创建一个新的应用程序实例,因为我们必须确保用户 ID 匹配并且在客户端之间是唯一的。

基本上,我们的“MasterApplication”数据库有一个“User”表,其中包含一个 UserId 和用于查找剩余用户数据的数据库名称。每个客户端都有自己的数据库用户,只能访问“MasterApplication”和自己的客户端表。

这是一个外观示例。

CREATE DATABASE MasterDatabase
CREATE DATABASE Client1
CREATE DATABASE Client2

CREATE TABLE `MasterDatabase`.`Person` (
  `PersonId` INT NOT NULL AUTO_INCREMENT,
  `DatabaseName` Varchar(20) NOT NULL,
  PRIMARY KEY (`PersonId`)
)

CREATE TABLE `Client1`.`Person` (
      `PersonId` INT NOT NULL,
      `FirstName` Varchar(20) NOT NULL,
      PRIMARY KEY (`PersonId`)
    )

CREATE TABLE `Client2`.`Person` (
     `PersonId` INT NOT NULL,
     `FirstName` Varchar(20) NOT NULL,
      PRIMARY KEY (`PersonId`)
)

INSERT INTO MasterDatabase.Person VALUES (1, 'Client1');
INSERT INTO MasterDatabase.Person VALUES (2, 'Client2');

INSERT INTO Client1.Person VALUES (1, 'Matt');
INSERT INTO Client2.Person VALUES (2, 'Scott');

所以 Client1 将拥有一个可以访问 MasterDatabase 和 Client1 表的数据库用户。 Client2 将拥有一个可以访问 MasterDatabase 和 Client2 的用户。

我希望有某种方法可以使用 MasterDatabase 中“DatabaseName”字段中的数据轻松地进行跨模式查询,但我想不通。我知道大部分情况下我可以将客户端的数据库名称存储在应用程序逻辑中,然后将其插入到查询中,但是有一些地方我需要将所有客户端加入到一个查询中。

我的尝试是做

SELECT *, `DatabaseName` INTO @DB FROM MasterDatabase.Person 
LEFT JOIN @DB.Person ON MasterDatabase.Person.PersonId = @DB.Person.PersonId

但这并没有像我希望的那样奏效。有没有办法我可以通过程序来做到这一点?如果您有任何其他想法,我也愿意为每个客户分离用户数据。

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    我认为你可以在存储过程中做到这一点。它看起来像

    DELIMITER //
    CREATE DEFINER='root'@'localhost' PROCEDURE GetData(IN user_id INT)
    BEGIN
      DECLARE db_name varchar(100);
      SELECT DatabaseName INTO db_name FROM MasterDatabase.Person WHERE  PersonId = user_id;
      SET @t1 =CONCAT('SELECT * FROM ',db_name,'.Person' );
      PREPARE stmt1 FROM @t1;
      EXECUTE stmt1;
    END//
    

    更新对不起,我忘了DEALLOCATE PREPARE stmt1;;应该在EXECUTE stmt1;之后

    【讨论】:

    • 感谢您的回复,虽然这适用于获得 1 个用户,但我希望有一个解决方案可以将每个模式与一个函数/查询连接起来。我想我可以遍历每个用户并基本上做你所拥有的,但我认为这不是很有效。
    猜你喜欢
    • 2012-01-18
    • 2021-04-26
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 2021-01-04
    • 2012-02-04
    相关资源
    最近更新 更多