通过定义者角色权限在PL/SQL过程中执行动态DDL

2023-12-26

我想在管理员用户拥有的过程中执行一些动态 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;

我尝试过的:

  • 从进程上设置为 AUTHID DEFINER 且 AUTHID CURRENT_USER 的函数运行该过程(希望该函数能够以某种方式级联定义器)
  • 在函数内放置一个匿名块来执行 DDL(因为角色似乎计入匿名块中)

如果我将 AUTHID 设置为 CURRENT_USER,我可以使用管理员用户正确执行该过程。

有什么方法可以解决这个问题,而无需直接向管理员用户授予 CREATE TABLE 权限?


您只能在 PL/SQL 存储过程/函数中设置角色(如果它具有)祈求者的权利 (AUTHID CURRENT_USER)(参见文档) https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/subprograms.htm#LNPLS00809。这意味着您不能使用 ops_user 调用 admin_user 的过程,然后访问 admin_user 的角色。如果您的 DBA 坚持使用角色来控制CREATE TABLE特权,这是我之前见过的方法:

create or replace package admin_user.role_test authid current_user is
    procedure test_permissions;
end role_test;
/
create or replace package body admin_user.role_test is
    procedure test_permissions is
        v_query_string VARCHAR2(400 CHAR) := 'begin 
dbms_output.put_line(''after'');
for r in (select role from session_roles) loop 
    dbms_output.put_line(r.role); 
end loop;
end;';
    begin
        dbms_output.put_line('before');
        for r in (select role from session_roles) loop
            dbms_output.put_line(r.role);
        end loop;
        DBMS_SESSION.SET_ROLE('CREATE_TABLE_ROLE IDENTIFIED BY "SECRET_PASSWORD"');
        execute immediate v_query_string;
        DBMS_SESSION.SET_ROLE('ALL EXCEPT CREATE_TABLE_ROLE'); -- restore defaults
    end;
end role_test;
/
grant execute on admin_user.role_test to ops_user;

这将暂时将角色授予 ops_user 只是为了执行您的代码。默认情况下,ops_user 不应该能够查看 admin_user 的包主体源。您可以包裹包裹主体以进一步保护密码。但除了密码安全之外,我对这种方法最大的担忧是 Oracle 没有提供禁用单个角色的好方法,因此如果 ops_user 有其他受密码保护的角色,则此代码在尝试恢复时可能会引发 ORA-01979他们。

所以,有一个答案,但我仍然建议按照其他评论者的建议进行操作,并向您的管理员用户授予 CREATE TABLE 权限。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过定义者角色权限在PL/SQL过程中执行动态DDL 的相关文章

随机推荐

  • Silverlight 3 中的剪贴板支持

    我正在考虑开发一个在 DataGrid 中显示大量信息的 Silverlight 应用程序 我希望以某种方式让用户能够通过剪贴板将其复制到 Excel 中 这在 Silverlight 3 中可能实现吗 不可以 SL3 中不提供此功能 请阅
  • 我需要在 BlackBerry Webworks 应用程序中嵌入 > 4MB 的内容文件(适用于 BlackBerry 6/7)。我有什么选择?

    我正在开发一个内容丰富的 Webworks 应用程序 为了使应用程序有用 它需要维护一个本地内容数据库 SQL 形式大约 4MB 进一步减少数据库的唯一方法是删除整个内容类别 我最初的想法是 我将 SQL 文件嵌入到应用程序中 就像 CSS
  • 如何以编程方式滚动到 WinRT 中文本框的底部?

    我正在为 WinRT 编写一个简单的应用程序 但我无法找到一种在代码中自动滚动到文本框底部的方法 我正在将日志信息写入文本框 并希望它滚动 以便最新的条目在框中可见 但似乎没有任何效果 以下是我尝试过的一些事情 将文本框放置在 Scroll
  • Kafka - 代理:消息大小太大

    I get Message size too large当我尝试发送超过 1 Mb 大小的消息时出现异常 当我尝试生成消息时 该错误出现在我的客户端应用程序中 经过一番谷歌搜索后 我发现应该更改设置以增加最大消息大小 嗯 我在 kafka
  • Popover segue 到静态单元 UITableView 导致编译错误

    我目前有一个带有两个视图控制器的应用程序 第一个是具有嵌入式表视图的视图控制器 该表视图具有动态单元格 第二个是带有静态单元格的表视图控制器 如果我通过选择动态表的单元格之一将 Segue 添加到静态表视图控制器 使用 Push 或 Mod
  • 在 Netbeans 中更快地搜索文件

    是否有现有的插件或调整可以加速 Netbeans 中的 转到文件 搜索 与 Eclipse 相比 Netbeans 搜索速度太慢 特别是如果有多个大型项目 I know I can use CTRL O for Go To Type but
  • fopen什么时候会失败?

    在我的 PHP 代码中 我打开一个文件并向其中附加文本 我使用这段代码 ourFileHandle fopen ourFileName a or die can t open file 当加载 PHP 页面时会发生这种情况 现在如果两个人同
  • 如何从程序中删除日志调试语句

    我在用boost log作为我的 C 程序的记录器 在开发过程中我经常这样使用它 例如 define LOG severity BOOST LOG SEV boost logger get severity define LOG ERR L
  • 学习嵌入式编程的最佳平台? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 我可以在生产中使用 IOSurface 框架录制屏幕吗

    如果我使用 IOSurface 框架制作我的应用程序的视频 苹果会拒绝我的应用程序吗 是的 如果您链 接 IOSurface Apple 将拒绝您的应用程序 商店中的一些项目正在使用它 但他们可能会在运行时加载它 iOS 应用 Displa
  • Swift 2 将 Json 解析为数组的可选

    我正在从网络服务获取国家 地区列表 收到后我用这段代码来处理它 if let json try NSJSONSerialization JSONObjectWithData data options as NSDictionary trig
  • 在 AWS Step Functions 中,可以使用静态字符串格式化参数值吗?

    在 AWS Step Functions 中 我们可以使用以下语法将之前步骤中的参数用作输入 Parameters Details weight product weight unit grams 举个例子 说product weight
  • Swift 中的 PerformSelector 的替代品?

    The performSelector方法族在 Swift 中不可用 https developer apple com library prerelease ios documentation swift conceptual build
  • SQLSTATE[HY000]:一般错误:Laravel 发生 2053 错误

    首先 我的环境是LAMP M代表MariaDB 整个错误是 SQLSTATE HY000 General error 2053 SQL UPDATE Demos SET Hit ifnull Hit 0 1 WHERE id 27 模型中的
  • 以与 SSISDB 不同的用户身份执行 SSIS 包

    我们要求用户使用代理帐户并引用输入参数来执行 SSIS 包 下面演示了用于调用包执行的语法 DECLARE ExportID INT 1 DECLARE ExecutionID INT EXECUTE AS proxy account EX
  • 如何将我的 MAUI 应用连接到 Firestore 数据库? (通过服务帐户 json 文件)

    创建一个 MAUI 应用程序并尝试将其连接到 Firestore 我正在跟进这里的建议 https cloud google com dotnet docs reference Google Cloud Firestore latest下载
  • Spring集成测试启动缓慢。原因?无法禁用 RabbitMQ

    我在启动集成测试时遇到性能问题 我正在尝试模拟系统的消息传递 为此 我基本上使用 MockBean在我的网关上并使用 EnableAutoConfiguration exclude RabbitAutoConfiguration class
  • Discord.py 按钮响应交互在一段时间后失败

    我有一个非常基本的脚本 它会弹出一条消息 其中包含带有命令 place 的按钮 单击此按钮后 机器人会向单击它的用户回复 嗨 如果按钮没有交互超过大约 3 分钟 它就会开始返回 交互失败 之后按钮就变得毫无用处 我假设有某种内部超时 我在文
  • 数组索引越界 - Java

    我已经开始编写我的第一个 Java 程序 这是一个简单的计算器 但是我收到一条错误消息 声称我的数组超出范围 我尝试对其进行调试 以了解出现这种情况的位置和原因 并按照纸上的代码进行操作 这两者都显示了我期望和希望的结果 因此 我看不出问题
  • 通过定义者角色权限在PL/SQL过程中执行动态DDL

    我想在管理员用户拥有的过程中执行一些动态 DDL 我想使用具有定义者权限的技术操作用户执行此过程 操作用户没有创建表角色 问题是 创建表 权限是通过使用角色授予管理员用户的 这不允许我执行 DDL 因为角色似乎不计入命名的 pl sql 块