我有一个数据库,几个真正的用户可以使用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
的执行权限,他就可以随意提供任何表前缀并混淆其他用户的数据 - 因此我的用户分离已经消失。这是我需要解决的问题。
我目前看到两种解决方案:
table-prefix_MyProcedure()
,只能由一个用户执行)。然后,仅将执行权限分配给相应的用户。但是,这应该根据请求自动完成 - 因此,我需要能够创建一个带参数化名称的存储过程来设置它(phew)。正如标题所示,这是我想要的方式 - 但我真的很难动态创建存储过程的语法(在存储过程中),因此,我真的不确定这是否应该如何进行。 我是如何解决这个问题的?
此致
芬兰劳特