powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Global Application Context
6 сообщений из 6, страница 1 из 1
Global Application Context
    #39345815
dba123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть я неправильно понимаю ? Но мне казалось, что
эти комбинации разрешают всем сессиям (любого юзера или определенного)
получать контекстную переменную, не взирая установлен ли у него или нет sys_context('userenv','client_identifier')

на 12.1.0.2 получаю переменную только если sys_context('userenv','client_identifier') is null
как только устанавливаю идентификатор, переменная исчезает.

http://docs.oracle.com/database/122/DBSEG/using-application-contexts-to-retrieve-user-information.htm#GUID-A1A09E1A-7D2F-4407-8A6E-688E64A663F8__CIHJGGGF Table 9-2 Setting the DBMS_SESSION.SET_CONTEXT username and client_id Parameters

Combination Settings Result

username set to NULL
client_id set to NULL

This combination enables all users to access the application context. See "Sharing Global Application Context Values for All Database Users" for more information.
These settings are also used for database session-based application contexts. See "Using Database Session-Based Application Contexts" for more information.

username set to a value
client_id set to NULL

This combination enables an application context to be accessed by multiple sessions, as long as the username setting is the same throughout.
Ensure that the user name specified is a valid database user. See "Global Contexts for Database Users Who Move Between Applications" for more information.




Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
--тороплюсь, тест-кейс неполный, но все для теста есть

create user au1 identified by check1u1
 default tablespace users
 temporary tablespace temp
 quota 1M on users;

create user au2 identified by check2u2
 default tablespace users
 temporary tablespace temp
 quota 1M on users;

create user au3 identified by check3u3
 default tablespace users
 temporary tablespace temp
 quota 1M on users;

grant create session          to au1;
--масло масляное, просто у public-а нет dbms_session
grant execute on dbms_session to au1;

grant create session          to au2;
grant execute on dbms_session to au2;

grant create session          to au3;
grant create any context      to au3;
grant create procedure        to au3;
grant execute on dbms_session to au3;


alter user au1 default role none;
alter user au2 default role none;
alter user au3 default role none;


create context GCTX using set_ctx accessed globally;

create or replace procedure set_ctx ( p_ctx in varchar2,p_ctxvar in varchar2, p_ctxval in varchar2, p_usr in varchar2, p_sessident in varchar2)
 is
  begin
   -- установить глобальный контекст
   sys.dbms_session.set_context(p_ctx, p_ctxvar, p_ctxval, p_usr, p_sessident);
 end;
/
1. 
   -- ID у меня установливается в логон триггере
   -- поэтому очистим вначале
   au1>exec sys.dbms_session.clear_identifier;
   au1>exec sys.dbms_session.set_identifier('au1_id');
   au2>exec sys.dbms_session.clear_identifier;
   au3>exec sys.dbms_session.clear_identifier;

2. select sys_context('userenv','client_identifier') from dual;

3. au3> exec set_ctx('GCTX','VAR1','Val1', 'AU1', null);

   au1> select sys_context('GCTX','VAR1') from dual;
   au2> select sys_context('GCTX','VAR1') from dual;
   --очищаем/устанавливаем 
   exec sys.dbms_session.set_identifier('au1_id');
   --проверяем снова
   -- и т.д. еще 2 варианта

4. au3> exec set_ctx('GCTX','VAR1','Val3', null, 'au1_id');

   au1> select sys_context('GCTX','VAR1') from dual;
   au2> select sys_context('GCTX','VAR1') from dual;

5. au3> exec set_ctx('GCTX','VAR1','Val4', null, null);

   au1> select sys_context('GCTX','VAR1') from dual;
   au2> select sys_context('GCTX','VAR1') from dual;
...
Рейтинг: 0 / 0
Global Application Context
    #39346063
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dba123,
в описании комбинаций...
client_id set to NULLпочему же - "не взирая"?
...
Рейтинг: 0 / 0
Global Application Context
    #39346087
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
SCOTT@pdborcl12 > DROP CONTEXT app_ctx
  2  /

Context dropped.

SCOTT@pdborcl12 > CREATE OR REPLACE
  2    CONTEXT app_ctx using set_app_ctx
  3      ACCESSED GLOBALLY
  4  /

Context created.

SCOTT@pdborcl12 > CREATE OR REPLACE
  2    PROCEDURE set_app_ctx(
  3                          p_name VARCHAR2,
  4                          p_value VARCHAR2
  5                         )
  6      IS
  7      BEGIN
  8          dbms_session.set_identifier(user);
  9          dbms_session.set_context('app_ctx',p_name,p_value,null,user);
 10  END;
 11  /

Procedure created.

SCOTT@pdborcl12 > GRANT EXECUTE ON set_app_ctx TO u1
  2  /

Grant succeeded.

SCOTT@pdborcl12 > begin
  2      set_app_ctx('Var1', 'SCOTT');
  3      set_app_ctx('Var2', 'TIGER');
  4  end;
  5  /

PL/SQL procedure successfully completed.

SCOTT@pdborcl12 > SELECT  sys_context('app_ctx','var1') var1,
  2          sys_context('app_ctx','var2') var2
  3    FROM  DUAL
  4  /

VAR1       VAR2
---------- ----------
SCOTT      TIGER

SCOTT@pdborcl12 > connect u1@pdborcl12
Enter password: **
Connected.
U1@pdborcl12 > show user
USER is "U1"
U1@pdborcl12 > begin
  2      scott.set_app_ctx('Var1', 'U1');
  3      scott.set_app_ctx('Var2', 'LION');
  4  end;
  5  /

PL/SQL procedure successfully completed.

U1@pdborcl12 > SELECT  sys_context('app_ctx','var1') var1,
  2          sys_context('app_ctx','var2') var2
  3    FROM  DUAL
  4  /

VAR1       VAR2
---------- ----------
U1         LION

U1@pdborcl12 > connect scott@pdborcl12
Enter password: *****
Connected.
SCOTT@pdborcl12 > SELECT  sys_context('app_ctx','var1') var1,
  2          sys_context('app_ctx','var2') var2
  3    FROM  DUAL
  4  /

VAR1       VAR2
---------- ----------


SCOTT@pdborcl12 > begin
  2                   dbms_session.set_identifier(user); -- you MUST set identifier
  3               end;
  4  /

PL/SQL procedure successfully completed.

SCOTT@pdborcl12 > SELECT  sys_context('app_ctx','var1') var1,
  2          sys_context('app_ctx','var2') var2
  3    FROM  DUAL
  4  /

VAR1       VAR2
---------- ----------
SCOTT      TIGER

SCOTT@pdborcl12 > connect u1@pdborcl12
Enter password: **
Connected.
U1@pdborcl12 > SELECT  sys_context('app_ctx','var1') var1,
  2          sys_context('app_ctx','var2') var2
  3    FROM  DUAL
  4  /

VAR1       VAR2
---------- ----------


U1@pdborcl12 > begin
  2                   dbms_session.set_identifier(user); -- you MUST set identifier
  3               end;
  4  /

PL/SQL procedure successfully completed.

U1@pdborcl12 > SELECT  sys_context('app_ctx','var1') var1,
  2          sys_context('app_ctx','var2') var2
  3    FROM  DUAL
  4  /

VAR1       VAR2
---------- ----------
U1         LION

U1@pdborcl12 > -- but you still are able to see SCOTT's context attributes
U1@pdborcl12 > begin
  2                   dbms_session.set_identifier('SCOTT');
  3            end;
  4  /

PL/SQL procedure successfully completed.

U1@pdborcl12 > SELECT  sys_context('app_ctx','var1') var1,
  2          sys_context('app_ctx','var2') var2
  3    FROM  DUAL
  4  /

VAR1       VAR2
---------- ----------
SCOTT      TIGER

U1@pdborcl12 >




А если юзеры не должны видеть аттрибуты друг-друга (т.е. глобальный для всех сессий одного и того же юзера:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
SCOTT@pdborcl12 > DROP CONTEXT app_ctx
  2  /

Context dropped.

SCOTT@pdborcl12 > CREATE OR REPLACE
  2    CONTEXT app_ctx using set_app_ctx
  3      ACCESSED GLOBALLY
  4  /

Context created.

SCOTT@pdborcl12 > CREATE OR REPLACE
  2    PROCEDURE set_app_ctx(
  3                          p_name VARCHAR2,
  4                          p_value VARCHAR2
  5                         )
  6      IS
  7      BEGIN
  8          dbms_session.set_identifier(user);
  9          dbms_session.set_context('app_ctx',p_name,p_value,user,user);
 10  END;
 11  /

Procedure created.

SCOTT@pdborcl12 > GRANT EXECUTE ON set_app_ctx TO u1
  2  /

Grant succeeded.

SCOTT@pdborcl12 > begin
  2      set_app_ctx('Var1', 'SCOTT');
  3      set_app_ctx('Var2', 'TIGER');
  4  end;
  5  /

PL/SQL procedure successfully completed.

SCOTT@pdborcl12 > SELECT  sys_context('app_ctx','var1') var1,
  2          sys_context('app_ctx','var2') var2
  3    FROM  DUAL
  4  /

VAR1       VAR2
---------- ----------
SCOTT      TIGER

SCOTT@pdborcl12 > connect u1@pdborcl12
Enter password: **
Connected.
U1@pdborcl12 > show user
USER is "U1"
U1@pdborcl12 > begin
  2      scott.set_app_ctx('Var1', 'U1');
  3      scott.set_app_ctx('Var2', 'LION');
  4  end;
  5  /

PL/SQL procedure successfully completed.

U1@pdborcl12 > SELECT  sys_context('app_ctx','var1') var1,
  2          sys_context('app_ctx','var2') var2
  3    FROM  DUAL
  4  /

VAR1       VAR2
---------- ----------
U1         LION

U1@pdborcl12 > connect scott@pdborcl12
Enter password: *****
Connected.
SCOTT@pdborcl12 > show user
USER is "SCOTT"
SCOTT@pdborcl12 > SELECT  sys_context('app_ctx','var1') var1,
  2          sys_context('app_ctx','var2') var2
  3    FROM  DUAL
  4  /

VAR1       VAR2
---------- ----------


SCOTT@pdborcl12 > exec dbms_session.set_identifier(user);

PL/SQL procedure successfully completed.

SCOTT@pdborcl12 > SELECT  sys_context('app_ctx','var1') var1,
  2          sys_context('app_ctx','var2') var2
  3    FROM  DUAL
  4  /

VAR1       VAR2
---------- ----------
SCOTT      TIGER

SCOTT@pdborcl12 > connect u1@pdborcl12
Enter password: **
Connected.
U1@pdborcl12 > show user
USER is "U1"
U1@pdborcl12 > SELECT  sys_context('app_ctx','var1') var1,
  2          sys_context('app_ctx','var2') var2
  3    FROM  DUAL
  4  /

VAR1       VAR2
---------- ----------


U1@pdborcl12 > exec dbms_session.set_identifier(user);

PL/SQL procedure successfully completed.

U1@pdborcl12 > SELECT  sys_context('app_ctx','var1') var1,
  2          sys_context('app_ctx','var2') var2
  3    FROM  DUAL
  4  /

VAR1       VAR2
---------- ----------
U1         LION

U1@pdborcl12 > exec dbms_session.set_identifier('SCOTT');

PL/SQL procedure successfully completed.

U1@pdborcl12 > SELECT  sys_context('app_ctx','var1') var1,
  2          sys_context('app_ctx','var2') var2
  3    FROM  DUAL
  4  /

VAR1       VAR2
---------- ----------


U1@pdborcl12 > 




SY.
...
Рейтинг: 0 / 0
Global Application Context
    #39346299
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Global Application Context
    #39346720
dba123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY, Вячеслав Любомудров,

Спасибо за примеры.
хотя Слава в своем примере зачем-то поменял параметры местами, наверное, чтобы запутать меня еще больше :).
Код: plsql
1.
2.
3.
 
                        gctx_set(field in varchar2, value in varchar2, cl_ident varchar2, usr varchar2 default user)
dbms_session.set_context('GCTX', field,             value,             usr,               cl_ident);


У меня, можно сказать, претензии только к документации
или к своим ассоциациям, когда
Код: plsql
1.
2.
username set to NULL = all users (верно)
  client_id set to NULL = any client identifier (ложь)


документация
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
--комбинация 1
username  set to NULL      This combination enables all users to access the application context. See "Sharing Global Application Context Values for All Database Users" for more information.
client_id set to NULL      These settings are also used for database session-based application contexts. See "Using Database Session-Based Application Contexts" for more information.

Нет уточнения, что юзеры все, да НЕ ВСЕ, а только те, в сессиях которых
sys_context('userenv','client_identifier') is NULL

--комбинация 2
username set to a value    This combination enables an application context to be accessed by multiple sessions, as long as the username setting is the same throughout.              
client_id set to NULL      Ensure that the user name specified is a valid database user. See "Global Contexts for Database Users Who Move Between Applications" for more information.

Контексты видны множественным сессиям указанного валидного пользователя,
but only for session, where sys_context('userenv','client_identifier') is NULL


Давно использую глобальные контексты на уровне приложений с установленным client_identifier и проблем особых нет.

Они появляются, как только я принимаю за исходные данные:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
client_identifier - уникальный идентификатор клиента ! 
                    И клиент не может менять его
                    (на уровне alter system rewrite client_identifier запрещен
                    для dbms_application_info.set_client_info )

                    идентификатор может быть и сложно-составным: из постоянной части, групповой и уникальной
                    например, №экземпляра/№контейнера/категория/группа/username/sid,serial#/ip address

   1:1:orcl:Gold Partner:developers:scott:21,2222:172.16.11.11

И тогда не вижу способа установки контекстных переменных для всех или группы сессий на уровне приложений.

- нет шаблонов в dbms_session.set_context(,,,,'1:1:orcl:Gold Partner:developers%');

- нет возможности указать полиси-функцию

- правда, остаются множественные переключения client_identifier(хорошо - один дополнительный
  '1' -  для экземпляра), чтобы открыть зоны видимости для условно-постоянных частей идентификатора.
  Но это, на мой взгляд, слишком усложняет код приложения и потребует больше памяти для контекстов.
  К тому же в "Дано:" клиент не может менять client_identifier

Текущие варианты с client_id set to NULL, на мой взгляд,
больше подходят к сессиям пула, когда одна из них отработала от имени конкретного клиента
и очистила client_identifier, чтобы посмотреть переменные для освободившихся.
Но не дает возможность установить переменную сразу всем(любым) пользовательским(несистемным) сессиям на уровне приложений.
...
Рейтинг: 0 / 0
Global Application Context
    #39348554
dba123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dba123,

Как вариант вместо шаблона, чтобы не переключать client_identifier, можно посмотреть что установлено для групп
в динамическом представлении:
[src oracle]select * from v$globalcontext;
[/oracle]
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Global Application Context
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]