В ходе исследований по loopback links чуть было не попал впросак с отловом сессий, создаваемых для dblink.
Судя по всему Oracle создает сессию для dblink один раз. В доказательство этого сделаем after logon trigger, который будет собирать информацию о подключениях
SQL> DROP TABLE log_session PURGE;
Table dropped.
SQL> CREATE TABLE log_session(username VARCHAR2(30), conn_time timestamp, info VARCHAR2(4000));
Table created.
SQL> CREATE OR REPLACE TRIGGER ta_connect AFTER logon ON DATABASE
2 BEGIN
3 INSERT INTO log_session VALUES (USER, SYSTIMESTAMP, NULL);
4 COMMIT;
5 END;
6 /
Trigger created.
SQL> SHOW ERRORS
No errors.
SQL> CONNECT SYSTEM/manager
Connected.
SQL> SELECT COUNT(*) FROM log_session;
COUNT(*)
----------
1
Мы подключились, строка вставилась
SQL> SELECT * FROM dual@loopback;
D
-
X
SQL> SELECT COUNT(*) FROM log_session;
COUNT(*)
----------
2
Первое обращение по dblink, создалась сессия
SQL> SELECT * FROM dual@loopback;
D
-
X
SQL> SELECT COUNT(*) FROM log_session;
COUNT(*)
----------
2
Второе обращение по dblink – сессия не создалась, используется предыдущая
SQL> SELECT 'Hello' FROM a@loopback WHERE ROWNUM=1;
'HELL
-----
Hello
SQL> SELECT COUNT(*) FROM log_session;
COUNT(*)
----------
2
Поменяем таблицу – результат тот же. Новой сессии нет
SQL> CONNECT SYSTEM/manager
Connected.
SQL> SELECT COUNT(*) FROM log_session;
COUNT(*)
----------
3
Переподключились, теперь счетчик стал 3
SQL> SELECT * FROM dual@loopback;
D
-
X
SQL> SELECT COUNT(*) FROM log_session;
COUNT(*)
----------
4
В свежей сессии для dblink выполняется еще одно подключение
Комментариев нет:
Отправить комментарий