11

我主要是甲骨文新手,如果这是一个愚蠢的问题,请原谅我......

我有一个名为“CODE”的模式,其中包含一个执行任意 SQL 的存储过程(现在,请忽略与之相关的潜在安全问题)。传入的SQL会选择数据;但所有数据都驻留在模式 A、B 或 C 中——但 SQL 一次只能从一个模式中进行选择。

例如:A 类型的用户创建一个字符串“SELECT * FROM A.USERTABLE” - 而 B 类型的用户创建一个字符串“SELECT * FROM B.USERTABLE”。

我想要做的是允许用户不明确指定他们的架构。在前端 .net 应用程序中;我已经知道它们是类型 A、B 还是 C。我希望所有三个都简单地输入“SELECT * FROM USERTABLE”。

我遇到的问题是我不知道该怎么做。我的应用程序只能在“CODE”架构中执行 proc - 所以我不能只是复制代码并让用户 A 调用“A.ExecuteSQL”。

我尝试了几件事;但到目前为止没有任何效果。我希望 ExecuteSQL 过程保留在 CODE 模式中;但是当'USERTABLE'被传入时,我需要它知道有时这意味着A.USERNAME,有时是B.USERNAME。

有什么建议么?

4

2 回答 2

12

采用:

ALTER SESSION SET CURRENT_SCHEMA = schema

相当于 SQL Server 的EXECUTE AS语法

于 2010-03-04T03:35:53.070 回答
9

另一种选择是使用 AUTHID CURRENT_USER pragma。

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

IE

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 以用户权限执行。

我已经用它来管理类似的“动态运行任何旧的 SQL”例程 - 至少您将阻止“普通”用户使用您的存储过程删除表或安装附加代码代码模式。

(如果您还没有添加一些验证以排除某些关键字,也可能值得 - 即必须以 SELECT 开头,不得包含嵌入的 pl/sql 块 - 在不破坏现有代码的情况下您可以逃脱的任何事情)。

于 2010-06-28T16:25:08.643 回答