【问题标题】:Grant all on procedures to user将所有程序授予用户
【发布时间】:2018-01-31 12:28:37
【问题描述】:

当我通过将object_type替换为表[OBJECT_TYPE='TABLE']来执行以下语句时,它执行成功,当我尝试如下过程时,它返回错误:表或​​视图不退出。

BEGIN
   FOR R IN (SELECT OWNER, OBJECT_NAME FROM ALL_OBJECTS WHERE owner = 'MY_SCHEMA' AND OBJECT_TYPE='PROCEDURE') LOOP
      execute IMMEDIATE 'GRANT ALL ON '|| R.OWNER ||'.'||R.OBJECT_NAME ||' TO MyUser';
   END LOOP;
END;

注意:当我也尝试作为单个语句执行时,它会成功运行。

GRANT ALL ON MY_SCHEMA.ProcedureName TO MyUser;

那么有什么区别,为什么在程序上不起作用。

【问题讨论】:

  • 我在这里删除了多个 RDBMS 标签;这显然不是 t-sql,但请用正确的更新您的帖子。
  • 为什么不授予您对整个架构的权限?
  • 我想将用户模式 ​​A 的所有权限授予另一个用户模式 ​​B 并且除了授予所有表或过程然后创建所有对象的同义词之外,没有办法在一个语句中授予所有权限。 @dan-bracuk
  • 对我来说很好。这会在列表中的第一个过程中失败,还是在失败之前有某种方式?如果有一个失败了,而其他人成功了,你需要找出它有什么不同。我怀疑一些命名空间冲突(例如,公共同义词恰好与过程共享相同的名称),尽管我想不出任何会像这样失败的场景。

标签: sql oracle stored-procedures plsql


【解决方案1】:

尝试显示所有语句,然后运行所有语句。其中之一肯定会给你这个错误!

试试这个:

SET serveroutput ON;
DECLARE
  v_sql VARCHAR2(4000);
BEGIN
  FOR R IN
  (SELECT OWNER,
    OBJECT_NAME
  FROM ALL_OBJECTS
  WHERE owner    = 'MY_SCHEMA'
  AND OBJECT_TYPE='PROCEDURE'
  )
  LOOP
    v_sql:= 'GRANT ALL ON '|| R.OWNER ||'.'||R.OBJECT_NAME ||' TO MyUser';
    dbms_output.put_line(v_sql);
  END LOOP;
END;

然后运行所有这些语句,以便找到导致错误的确切语句。

【讨论】:

  • 是的,这是个好主意,我测试过,它与作为一条语句执行并没有错误没有什么不同。并且仍然想知道为什么在单个语句上而不是在循环上。谢谢。
  • hmmm .. 我无语了:)
  • 也许没有错误,因为它只打印 GRANT 语句。把execute immediate 放回去怎么样?
  • @WilliamRobertson,他打印语句,然后手动运行所有语句,没有错误..但是当他执行它们时,给出错误..
猜你喜欢
  • 2020-11-22
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 2020-11-29
  • 1970-01-01
相关资源
最近更新 更多