我目前正在从 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
答案 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;