相当于 DB2 的 Oracle 上下文

时间:2021-02-24 09:51:30

标签: oracle db2 db2-luw

我目前正在从 oracle 迁移到 DB2。我在大多数应用程序中积极使用 sys_context 来通过会话(IIS 和 .net 框架)获取登录用户的用户 ID。

我希望将以下脚本集从 oracle 转换为 DB2。到目前为止,无法在 DB2 中找到与 oracle 上下文等效的任何内容。

SQL> create context my_ctx
  2    using pkg_ctx;

Context created.

SQL> create package pkg_ctx
  2  as
  3    procedure set_context;
  4  end;
  5  /

Package created.

SQL> create or replace package body pkg_ctx
  2  as
  3    procedure set_context
  4    as
  5    begin
  6      dbms_session.set_context( 'MY_CTX', 'USERNAME', 'test' );
  7    end;
  8  end;
  9  /

Package body created.

SQL> exec pkg_ctx.set_context;

PL/SQL procedure successfully completed.

SQL> select sys_context( 'MY_CTX', 'USERNAME' )
  2    from dual;

SYS_CONTEXT('MY_CTX','USERNAME')
-------------------------------------------------------------------------------
test 

3 个答案:

答案 0 :(得分:1)

假设您使用 Db2 for LUW,您可以使用 CURRENT CLIENT_* 注册表变量之一将会话上下文信息从客户端应用程序传递到服务器。例如,在客户端会话初始化期间,您将发出 SET CURRENT CLIENT_USERID='stacky',然后在服务器上该变量可以由例程或触发器读取。

答案 1 :(得分:0)

它是这样工作的,还没有在应用程序级别尝试过。但是从数据库尝试从同一数据库的 2 个不同实例在 DB2 上注册 2 个用户。

call sysproc.wlm_set_client_info('stacky',null,null,null,null);
select wlm_set_client_info from  sysibm.sysdummy1;

返回堆叠

来自同一数据库的另一个实例

call sysproc.wlm_set_client_info('test',null,null,null,null);
select wlm_set_client_info from  sysibm.sysdummy1;

返回测试。

将通过创建用户会话从应用程序级别尝试此操作,将监控这与特殊寄存器的工作情况。

不确定这是否是执行此操作的确切方法,将探索更多并保持更新。

答案 2 :(得分:0)

用于在我们的环境中复制类似情况,同时进行从 oracle 到 DB2 LUW 的迁移。

下面的过程将我们需要的 user_id(限制为 varchar 255)字段中的所有上下文值设置为 'key1:value1|key2:value2|'

设置上下文值的过程

CREATE OR REPLACE PROCEDURE setup_context(pValues        IN VARCHAR)
IS
lValues VARCHAR2(255) := pValues;
BEGIN
    --save the as is
    wlm_set_client_info(lValues, NULL, NULL, NULL, NULL);
END;

设置所需键值的过程

CREATE OR REPLACE FUNCTION sys_context(prefix IN VARCHAR) RETURN VARCHAR IS
    lValues VARCHAR2(255);
    lParam  VARCHAR2(255);
    lKey    VARCHAR2(255);
    lValue  VARCHAR2(255);
    lIndex  PLS_INTEGER;
BEGIN
    --get the data from the current session
    SELECT CURRENT CLIENT_USERID INTO lValues FROM dual;
    
    LOOP
        EXIT WHEN lValues IS NULL OR LENGTH(lValues) = 0;
 
        lIndex := instr(lValues, '|');
        IF lIndex > 0 THEN
            lParam  := substr(lValues, 1, lIndex-1);
            lValues := substr(lValues, lIndex+1);
        ELSE
            lParam  := lValues;
            lValues := NULL;
        END IF;
        lIndex := instr(lParam, ':');
        lKey   := substr(lParam, 1, lIndex-1);
        lValue := substr(lParam, lIndex+1);
        
       --get the matching value
        IF(lKey = prefix ) Then
            RETURN lValue;
        END IF;
    
    END LOOP;
   
   RETURN '';
END;

参考:https://www.ibm.com/support/knowledgecenter/en/SSEPEK_11.0.0/sqlref/src/tpc/db2z_sp_wlmsetclientinfo.html

相关问题