【发布时间】:2018-01-06 18:58:08
【问题描述】:
我想在管理员用户拥有的过程中执行一些动态 DDL。我想与具有定义者权限的技术操作用户一起执行此过程(操作用户没有创建表角色)。
问题是“创建表”权限是通过使用角色授予管理员用户的,这不允许我执行 DDL,因为角色似乎不计入命名的 pl/sql 块。
create or replace
PROCEDURE test_permissions AUTHID DEFINER AS
v_query_string VARCHAR2(400 CHAR) := 'CREATE TABLE TEST(abcd VARCHAR2(200 CHAR))';
BEGIN
EXECUTE IMMEDIATE v_query_string;
END;
我尝试了什么:
- 在 proc 上使用 AUTHID CURRENT_USER 从设置为 AUTHID DEFINER 的函数运行过程(希望该函数会以某种方式级联定义器)
- 在函数内部放置一个匿名块以执行 DDL(因为角色似乎计入匿名块中)
如果我将 AUTHID 设置为 CURRENT_USER,我可以使用管理员用户正确执行该过程。
有没有什么办法可以在不直接将 CREATE TABLE 授予管理员用户的情况下解决这个问题?
【问题讨论】:
-
您不能只创建一个在管理员架构中执行此操作的过程/函数,并将对该过程/函数的执行权限授予您心目中的用户。这样,您可以实现隔离+限制注入,如果您打算让查询保持打开状态,只需对通过的任何内容使用 execute immediate。
-
确实这是我打算做的,但管理员没有直接授权来创建表,只能通过角色。这似乎使得无法使用定义者权限执行该过程,即使它是由管理员用户自己执行的。
-
为什么不想将 CREATE TABLE 授予管理员用户?
-
如果 CREATE TABLE 不被公司政策允许,那么它也应该被角色禁止。请您的 DBA 将此权限授予您的用户。
-
是的,CREATE TABLE 授予架构对象的 ALTER 和 DROP 权限。
标签: oracle stored-procedures plsql grant database-permissions