oracle 在运行select之前检查表的访问权限

noj0wjuj  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(109)

我在PL/SQL中有三个函数。函数1使用user_tab_privs检查用户是否对表A、B、C具有SELECT访问权限。如果用户没有访问任何表的权限,则存储缺失计数。函数2从表A、B、C中选择一些数据。最后,函数3检查函数1中的计数值是否>0。如果此条件为TRUE,则引发异常并打印计数,否则继续执行函数2并输出。当用户有任何缺少的权限时,脚本会抛出ORA-00942: table or view does not exist instead of raising exception。当用户有任何缺少的访问权限时,如何输出raise_application_error而不是ORA-00942。
下面是最后一个函数的代码片段。

function function3 return clob is
..
    BEGIN
        missingcount := function1();
       if missingcount >0 then
            error := 'Failed ' || missingcount ');
            raise_application_error(-20101, error );
        ELSE
           fun2output := function2 ();
        end if;
    END function3;
BEGIN
 final := function3();
 dbms_output.put_line(final);
END;

如何在用户有任何访问权限缺失时输出raise_application_error,而不是ORA-00942。

jjhzyzn0

jjhzyzn01#

你需要异常处理。捕获你想要的异常,并引发你想要的任何异常:

DECLARE
  tab_does_not_exist exception;
  PRAGMA EXCEPTION_INIT(tab_does_not_exist,-00942);
BEGIN
  do-something-that-might-fail;
EXCEPTION
  WHEN tab_does_not_exist THEN
    RAISE_APPLICATION_ERROR(-20101,'my custom error message');
END;

有两个预先命名的异常,您不必使用杂注来定义。比如DUP_VAL_ON_INDEXNO_DATA_FOUNDTOO_MANY_ROWS以及其他六种。但是大多数异常没有名称,所以这就是您如何为它们给予名称,以便您可以仅对这些异常进行操作。或者,您可以使用WHEN OTHERS捕获所有异常,并参考其内部的SQLCODE函数来决定要做什么:

BEGIN
  do-something-that-might-fail;
EXCEPTION
  WHEN OTHERS THEN
    IF SQLCODE = -942
    THEN
      RAISE_APPLICATION_ERROR(-20101,'my custom error message');
    END IF;

    RAISE; -- re-raise anything else
END;

相关问题