【发布时间】:2020-11-09 19:35:17
【问题描述】:
我有一些存储过程可以创建用于验证目的的表。这些表中的大多数都会在下一次执行过程中被删除。
我创建了这些程序,当我运行它们时它们运行良好,但我的问题是现在我们希望其他人运行这些程序,但他们不能。
经过一番研究,我发现问题是存储过程试图写入我的架构,所以由于用户无权访问我的架构,他们会得到权限不足的错误。
存储过程有没有办法在调用存储过程的方案中创建表,而不是创建存储过程的人的架构?
这是我为测试创建的一个小存储过程:
CREATE OR REPLACE PROCEDURE XXX.SP_TMP_TEST ()
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER AS
BEGIN
CALL XXX.SP_DROP_TABLE_IF_EXISTS ('TMP_TEST');
CREATE COLUMN TABLE TMP_TEST (TEST INTEGER);
END
GRANT EXECUTE ON XXX.SP_TMP_TEST TO USER_B;
假设 USER_A 在 Schema XXX 中创建了这个存储过程
现在每次 USER_A 调用它时,表 TMP_TEST 都会创建到 USER_A 架构中。
假设 USER_B 尝试运行它。他们会得到一个错误,说不能存在两个同名的表。这是因为删除表的存储过程将表从 USER_B 的架构中删除,但创建表尝试在 USER_A 的架构上创建表。
这样做的唯一方法是将 SQL_SECURY 更改为 DEFINER,但这会让 USER_B 在 USER_A 的架构中创建表,并且我希望将表创建到 USER_B 的架构或 USER_C 或 D 中,无论谁调用存储过程。
我希望这是有道理的。
提前感谢您的时间和帮助。
问候, 莱昂纳多
【问题讨论】:
标签: stored-procedures ddl hana hana-sql-script