MySQL:动态创建存储过程

时间:2015-08-14 06:20:02

标签: mysql sql-server stored-procedures jdbc

我有一个数据库,几个真正的用户可以使用JDBC访问它。这些用户的分离非常重要,因此他们既不能看到也不能操纵彼此的数据。

为了分离用户的数据,我决定为每个用户创建几个相应的表,并且只向拥有用户授予该表的权限。这都是在存储过程中自动完成的。

除了这个表分离,我希望用户只执行存储过程来处理他的表,而不是任意的SQL查询。

让我们考虑像

这样的示例程序
DELIMITER //
CREATE PROCEDURE MyProcedure(IN p_identifier VARCHAR(30), IN p_key INT(10))
BEGIN
SET @p_identifier = p_identifier;
SET @p_key = p_key;

SET @s = CONCAT('DELETE FROM ', p_identifier, '_mytable WHERE key =?;');
PREPARE stmt FROM @s;
EXECUTE stmt USING @p_key,
DEALLOCATE PREPARE stmt;

END //
DELIMITER ;

并像CALL MyProcedure('ad3e981b', 2);一样使用它。

到目前为止,这么好。

由于所有用户都使用此过程(第一个paraeter是table-prefix),因此出现问题。这很糟糕,因为一旦用户获得MyProcedure的执行权限,他就可以随意提供任何表前缀并混淆其他用户的数据 - 因此我的用户分离已经消失。这是我需要解决的问题。

我目前看到两种解决方案:

  • 不要使用存储过程:只需将用户表上的INSERT / DELETE / SELECT权限授予用户即可。这很简单并且有效 - 但我更喜欢只通过JDBC调用存储过程,而不是任意的SQL查询。
  • 为每个用户创建一个存储过程,其中表前缀是不变的(例如,table-prefix_MyProcedure(),只能由一个用户执行)。然后,仅将执行权限分配给相应的用户。但是,这应该根据请求自动完成 - 因此,我需要能够创建一个带参数化名称的存储过程来设置它(phew)。正如标题所示,这是我想要的方式 - 但我真的很难动态创建存储过程的语法(在存储过程中),因此,我真的不确定这是否应该如何进行。

我是如何解决这个问题的?

此致

芬兰劳特

0 个答案:

没有答案