【发布时间】:2019-01-16 22:25:19
【问题描述】:
我正在尝试编写一个接受SELECT 查询并针对数据库列表执行它的 MySQL 存储过程。这甚至可以通过 MySQL 实现吗?
我们应用程序中的每个客户在同一个实例上都有自己的数据库。所有客户数据库的模式结构都是相同的。有时,我需要跨所有客户数据库(例如SELECT COUNT(*) FROM users)执行一个简单的 SELECT 查询。
我已经为常见的重复“实例范围”查询(如用户计数)创建了更多的存储过程,但我不想为一次性查询创建更多的存储过程(例如,查询由于错误代码导致的损坏记录、查询对于我们计划弃用的列等)。
我当前的解决方案是我有一个 node 脚本,我在本地运行该脚本以为每个数据库生成 SELECT 查询,然后使用 UNION 将它们全部连接起来以生成一个巨大的查询,然后我在数据库实例上执行该查询。
SELECT 'customerdb1' AS customer,
COUNT(*) AS user_count
FROM customerdb1.users
UNION
SELECT 'customerdb2' AS customer,
COUNT(*) AS user_count
FROM customerdb2.users
UNION
SELECT 'customerdb3' AS customer,
COUNT(*) AS user_count
FROM customerdb3.users
【问题讨论】:
-
当然可以,但听起来是个坏主意。存储过程可以在可能的不同 MySQL 用户和/或权限上运行。。您将如何控制它的安全性? .
-
存储过程将仅由对所有其他数据库只有
SELECT权限的特殊帐户使用。出于什么原因这是一个坏主意?安全?表现?可维护性? -
@dashmug 这是一个关于任意 SQL 输入的笑话:xkcd.com/327 创建存储过程以抽象出数据库逻辑(查询)。允许任意 SQL 代码通过会破坏最初的目的。相反,您可以完全阐明和定义客户需要的所有可能功能 - 创建单独的存储过程 - 然后提供有关可用过程的文档。这种严谨性将自我记录可用功能(使用单独的存储过程),并向您的客户和您自己充分阐明应用程序的行为。
-
是的,我知道小鲍比桌。实际上,在我想运行我的临时查询(不是我的用户)的意义上,它是“任意的”。我试图避免检索数据库列表然后对每个数据库执行查询的样板。
-
您的第一句话说“存储过程接受任意 SELECT 语句”,就这个词而言,它实际上是任何东西。您的后续问题“这是一个安全问题吗?”强调它仍然是任意的和未知的。将“任意”改为“我预先定义的陈述”,你会得到截然不同的答案。
标签: mysql amazon-aurora