代码之家  ›  专栏  ›  技术社区  ›  Rob P.

作为另一个用户执行Oracle存储过程

  •  9
  • Rob P.  · 技术社区  · 16 年前

    例如:类型A的用户创建字符串“从A.USERTABLE中选择*”,而类型B的用户创建字符串“从B.USERTABLE中选择*”。

    我试图做的是允许用户不显式地指定他们的模式。在前端.net应用程序中;我已经知道是A型,B型还是C型了。我希望这三个都只需输入'SELECT*fromUserTable'。

    我试过一些东西;但到目前为止,一切都不起作用。我希望ExecuteSQL过程保持在代码模式中;但是,当传入“USERTABLE”时,我需要它知道有时这意味着A.USERNAME,有时意味着B.USERNAME。

    有什么建议吗?

    2 回复  |  直到 16 年前
        1
  •  12
  •   OMG Ponies    16 年前

    ALTER SESSION SET CURRENT_SCHEMA = schema
    

    这就是问题所在 equivalent to SQL Server's EXECUTE AS syntax

        2
  •  8
  •   Florin Ghita    12 年前

    如果在包、过程、函数或类型名之后立即添加这两个关键字,则它将以执行用户的权限而不是代码模式执行。这将覆盖默认行为AUTHID DEFINER(编译代码的模式/用户的权限)

    CREATE FUNCTION examplefunc
        (pSqlStatement IN VARCHAR2)
    RETURN INTEGER
      AUTHID CURRENT_USER
    AS 
       lResult INTEGER;
    BEGIN
        EXECUTE IMMEDIATE pSqlStatement INTO lResult;
        RETURN lResult;
    END examplefunc;
    

    请注意,对于包中的函数和过程,pragma只能在包级别应用。不能按功能设置权限。

    这将导致函数、包等中的任何SQL以用户权限执行。

    (如果您还没有添加一些验证以丢弃某些关键字,也可能是值得的——例如,必须以SELECT开头,不得包含嵌入的pl/sql块——任何您可以在不破坏现有代码的情况下摆脱的东西)。

    推荐文章