【问题标题】:Oracle Session Parameter restricted to a UserOracle 会话参数仅限于用户
【发布时间】:2021-01-29 08:29:46
【问题描述】:

在 Oracle 数据库中,有没有办法将“会话参数”仅限于我的用户 ID? (或任何其他限制手段)

通常,使用 Oracle SQL Developer,我可以执行“ALTER SESSION SET param=value;”并且可以确认参数生效了。

但在 SQL Developer 之外,我希望我的本地应用程序客户端也具有相同的会话参数值。我找不到通过应用程序执行此操作的方法。

在连接到 Oracle 数据库时有没有办法做到这一点?又该怎么做呢?

谢谢。

【问题讨论】:

    标签: sql oracle session parameters


    【解决方案1】:

    使用登录触发器:

    CREATE OR REPLACE TRIGGER CHANGE_DATE_FORMAT
    AFTER LOGON ON DATABASE
    CALL DBMS_SESSION.SET_NLS('NLS_DATE_FORMAT','"YYYY-MM-DD HH24:MI:SS"')
    /
    

    或更改系统设置:

    ALTER SYSTEM SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS' SCOPE=BOTH;
    

    【讨论】:

    • 非常感谢您的帮助。我将使用这种方法。
    • 请注意,当前编写的触发器将适用于所有登录到数据库的用户。如果您想将此限制为特定用户,请将其设置为模式级登录触发器而不是数据库级触发器。
    • @pmdba,请注意。谢谢。
    【解决方案2】:

    您要使用的实际参数是什么?如果您不喜欢运行 ALTER SESSION 的登录触发器(我记得 Oracle 的 Tom Kyte 不喜欢这些触发器),可以通过环境变量设置一些。例如 NLS_DATE_FORMAT 可以设置为环境变量(注意如果你设置了这个,你还需要设置 NLS_LANG)。

    在使用 Oracle 驱动程序连接池的应用程序中设置“会话状态”的另一种常见、有效的方法是使用“会话回调”,例如 Python

    # Set the NLS_DATE_FORMAT for a session
    def initSession(connection, requestedTag):
        cursor = connection.cursor()
        cursor.execute("ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI'")
    
    # Create the pool with session callback defined
    pool = cx_Oracle.SessionPool("hr", userpwd, "orclpdb1",
                         sessionCallback=initSession, encoding="UTF-8")
    
    # Acquire a connection from the pool (will always have the new date format)
    connection = pool.acquire()
    

    如果您决定使用 ALTER SESSION,请注意可以在一个命令中设置多个参数:alter session set nls_date_format = 'YYYY-MM-DD' nls_language = AMERICAN

    【讨论】:

    • 这是 OPTIMIZER_USE_INVISIBLE_INDEXES。我想在不影响其他用户的情况下测试一个不可见的索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多