gpt4 book ai didi

oracle - USER() 和 SYS_CONTEXT ('USERENV' ,'CURRENT_USER' 有什么区别?

转载 作者:行者123 更新时间:2023-12-03 21:48:10 24 4
gpt4 key购买 nike

在 Oracle 数据库中,以下各项有什么区别:

  • 用户()
  • sys_context('USERENV', 'CURRENT_USER')
  • sys_context('USERENV', 'SESSION_USER')

  • 这些是否也可能与“当前用户”相关的值?
  • sys_context('USERENV', 'CURRENT_SCHEMA')
  • sys_context('USERENV', 'AUTHENTICATED_IDENTITY')

  • 我特别感兴趣的是哪些可以更改,哪些可以更改,哪些不能更改值,哪些根据连接类型具有不同的值,哪些始终是用于登录的模式数据库。

    在我的大多数测试中,这些值总是相同的。唯一的异常(exception)是在运行以下命令来更改“CURRENT_SCHEMA”时:
    alter session set current_schema=<SCHEMA>

    执行以下操作会导致错误:
    alter session set current_user=<USER> --even as sys/system, which is good I suppose

    因此,所有这些都存在某种安全/规则。但是,拥有 SESSION_USER 和 CURRENT_USER 背后一定有一些原因。我还认为 user() 可能是 sys_context('USERENV', 'CURRENT_USER') 的快捷方式,但我找不到有关此事的文档。

    最佳答案

    使用 USER 时有一个重要的注意事项需要考虑。来自 PL/SQL 的函数。正如我所拥有的 documented in this blog post , STANDARD.USER()实现如下:

    function USER return varchar2 is
    c varchar2(255);
    begin
    select user into c from sys.dual;
    return c;
    end;

    因此,它委托(delegate)评估 user在 SQL 引擎中,这会导致隐藏的 PL/SQL 到 SQL 上下文切换。如果您经常这样做,例如从触发器内部,那么这在生产系统中可能是非常有害的。尽量避免调用 USER()来自 PL/SQL,并使用 sys_context('USERENV', 'SESSION_USER')反而。

    关于oracle - USER() 和 SYS_CONTEXT ('USERENV' ,'CURRENT_USER' 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11002746/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com