2010-12-07 4 views
2

그래서 클라이언트가 다른 클라이언트의 사용자 데이터와 분리 된 사용자 데이터를 원하는 웹 응용 프로그램을 작성하고 있습니다. 클라이언트가 서로 협력 할 수 있기 때문에 사용자 ID가 일치하고 클라이언트간에 고유한지 확인해야하므로 각 클라이언트에 대해 응용 프로그램의 새 인스턴스를 만들 수 없습니다.행 데이터를 기반으로 한 Mysql 크로스 스키마 쿼리

기본적으로 UserId와 나머지 사용자 데이터를 찾을 수있는 데이터베이스 이름이 포함 된 "User"테이블이있는 "MasterApplication"데이터베이스가 있습니다. 각 클라이언트에는 "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 

을했다하지만 기대했다로서 그 작동하지 않았다. 프로 시저로 어쩌면 내가 할 수 있을까? 또한 클라이언트 당 사용자 데이터를 분리하는 다른 아이디어에 대해서도 열려 있습니다.

답변

1

저장 프로 시저에서 수행 할 수 있다고 생각합니다. 그것은 미안 해요, 난 DEALLOCATE PREPARE stmt1;를 잊어

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// 

UPDATE 같이 보일 것이다; 그것은 뒤에 있어야합니다 EXECUTE stmt1;

+0

응답 주셔서 감사합니다, 1 사용자를 얻기 위해 작동하는 동안, 나는 하나의 기능/쿼리와 모든 스키마에 합류하는 솔루션에 대한 기대했다. 나는 모든 사용자를 반복 할 수 있고 본질적으로 가지고있는 일을 할 수 있다고 생각하지만, 그렇게 효율적이라고 생각하지는 않습니다. – crontab

관련 문제