首页 > 解决方案 > 基于登录用户的MySQL变量数据库表

问题描述

我正在尝试创建一个标准视图,该视图将根据正在选择视图的 MySQL 用户动态选择不同的数据库表。在主数据库中

在 database_clients 我有一个表 users_list 如下:

user_mysql 公司 sample_user1 company1 sample_user2 company2

然后,我将 IDENTICAL 客户端数据库与 IDENTICAL 客户端特定表分开,例如:

database_company1.table1 数据库_company2.table1

目前,我在每个客户端数据库中复制 IDENTICAL 视图,这很麻烦,并且需要我在进行更改时单独更新每个数据库视图。我的目标是拥有一个“主”视图,用于查询每个客户端数据库中的表,数据库由 MySQL 用户登录名确定。

我发现您可以使用以下方式识别客户端数据库:

SELECT company 
FROM database_clients.users_list
WHERE user_mysql = (SELECT SUBSTRING_INDEX(USER(), '@', 1));

我需要帮助的是尝试将其构建到主数据库客户端中的 VIEW 中。

当我尝试在 database_clients 中基于用户特定的条件构建“动态数据库”视图时,它会引发错误:

SELECT * 
FROM concat(
    'database_',
    (
        SELECT company 
        FROM database_clients.users_list 
        WHERE user_mysql = (
            SELECT SUBSTRING_INDEX(USER(), '@', 1))
    ),
    '.table1'
);

非常感谢任何指导!

凯文

标签: mysql

解决方案


谢谢...我更接近但不完全在那里...如果您查看下面的存储过程,我不知道如何正确使用变量“company”,它通过第二个准备语句部分进行。 ....想法?

SET @usernames = (SELECT SUBSTRING_INDEX(USER(), '@', 1));
SET @firstQuery = (CONCAT("SELECT company FROM database_client.users_list where user_mysql = ","'", @usernames,"'")); 

PREPARE company FROM @firstQuery;
EXECUTE company;

SET @finalQuery = (CONCAT("SELECT * FROM database_",company,".sample_table1"));

PREPARE stmt FROM @finalQuery;
EXECUTE stmt;

DEALLOCATE PREPARE company;
DEALLOCATE PREPARE stmt;

推荐阅读