Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как получить текст выполняемого PL/SQL запроса?  [new]
veel
Member

Откуда:
Сообщений: 10
Можно ли каким-либо образом в триггере after delete on my_table for each row получить текст PL/SQL, вызвавший операцию удаления в этой таблице?
15 янв 09, 15:42    [6691627]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст выполняемого PL/SQL запроса?  [new]
Elic
Member

Откуда:
Сообщений: 29980
veel
получить текст PL/SQL, вызвавший операцию удаления в этой таблице?
Удаляет SQL, а не PL/SQL
Но всё равно нет. Ибо ЫзмышлЫзм
15 янв 09, 15:45    [6691658]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст выполняемого PL/SQL запроса?  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
Elic

Но всё равно нет. Ибо ЫзмышлЫзм

Если челу нече делать то он сможет.
1 Определить транзакцию. из которой работаем
2 Определить сессию
3. Посмотреть что сессия делает
4. Не забыть проигнорировать сам триггер
Ну и далее везде.
15 янв 09, 15:50    [6691709]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст выполняемого PL/SQL запроса?  [new]
stax..
Guest
veel,

гляньте
ora_sql_txt

зи
слышал что ето баг, но ...

.....
stax
15 янв 09, 16:19    [6691973]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст выполняемого PL/SQL запроса?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
stax..
гляньте
ora_sql_txt
stax


ora_sql_txt is available inside DDL triggers only.

SY.
15 янв 09, 18:02    [6692870]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст выполняемого PL/SQL запроса?  [new]
stax..
Guest
SY
stax..
гляньте
ora_sql_txt
stax


ora_sql_txt is available inside DDL triggers only.

SY.

мне VB подсказал
Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production

SQL> drop table stax.t;

Table dropped.

SQL> create table t(id int);

Table created.


  1  CREATE OR REPLACE TRIGGER trg$t
  2  BEFORE INSERT OR UPDATE OR DELETE ON t
  3  -- FOR EACH ROW
  4    DECLARE
  5      c_sql_text ora_name_list_t;
  6      c_i int;
  7  BEGIN
  8     c_i := ora_sql_txt(c_sql_text);
  9     FOR i IN 1..c_i
 10     LOOP
 11      dbms_output.put_line('>>>' || c_sql_text(i));
 12     END LOOP;
 13*  END;
SQL> /

Trigger created.

SQL> set serveroutput on

SQL> insert into t values(111);
>>>insert into t values(111)


1 row created.

SQL> update t set id=222;
>>>update t set id=222


1 row updated.

SQL> delete t where id>0;
>>>delete t where id>0


1 row deleted.

SQL> 
ps
если чесно то мне надо было для RLS
.....
stax
15 янв 09, 20:09    [6693325]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст выполняемого PL/SQL запроса?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
stax..
мне VB подсказал
stax


BUG!!!:

SQL> select * from v$version
  2  /

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod
PL/SQL Release 10.2.0.4.0 - Production
CORE    10.2.0.4.0      Production
TNS for 32-bit Windows: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production

SQL> create table t(id int);

Table created.

SQL> CREATE OR REPLACE TRIGGER trg$t
  2  BEFORE INSERT OR UPDATE OR DELETE ON t
  3    DECLARE
  4      c_sql_text ora_name_list_t;
  5      c_i int;
  6  BEGIN
  7     c_i := ora_sql_txt(c_sql_text);
  8     FOR i IN 1..c_i
  9     LOOP
 10      dbms_output.put_line('>>>' || c_sql_text(i));
 11    END LOOP;
 12  END;
 13  /

Trigger created.

SQL> set serveroutput on
SQL> insert into t values(111);
insert into t values(111)
            *
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SCOTT.TRG$T", line 6
ORA-04088: error during execution of trigger 'SCOTT.TRG$T'

SQL> CREATE OR REPLACE TRIGGER trg$t
  2  BEFORE INSERT OR UPDATE OR DELETE ON t
  3    DECLARE
  4      c_sql_text ora_name_list_t;
  5      c_i int;
  6  BEGIN
  7     c_i := ora_sql_txt(c_sql_text);
  8     dbms_output.put_line(case when c_i is null then 'C_I is NULL' else 'C_I = ' || c_i end);
  9  END;
 10  /

Trigger created.

SQL> insert into t values(111);
C_I is NULL

1 row created.

SQL>  

Again, ora_sql_txt is not available in DML.

SY.

Сообщение было отредактировано: 15 янв 09, 20:36
15 янв 09, 20:32    [6693361]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст выполняемого PL/SQL запроса?  [new]
stax..
Guest
stax..
veel,

гляньте
ora_sql_txt

зи
слышал что ето баг, но ...

.....
stax
15 янв 09, 20:34    [6693364]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст выполняемого PL/SQL запроса?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
stax..
слышал что ето баг, но ...


So why use it if it will only work for 9.2.0.6.0 (and maybe for couple more releases)?

SY.
15 янв 09, 20:44    [6693386]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст выполняемого PL/SQL запроса?  [new]
stax..
Guest
SY
stax..
слышал что ето баг, но ...


So why use it if it will only work for 9.2.0.6.0 (and maybe for couple more releases)?

SY.

SY, не наю
я искал метод как узнать текст SQL в RLS
по дороге получіл вот такой ефект

я знал что
ora_sql_txt is available inside DDL triggers only

но оказалось ...

ps
кстати как узнать текст селекта в RLS ф-ции
......
stax
15 янв 09, 20:50    [6693399]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст выполняемого PL/SQL запроса?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
stax..
кстати как узнать текст селекта в RLS ф-ции
stax


Do not know about RLS. See if this works:

create or replace
  function get_sql
    return clob
    is
        v_stmt clob;
        cursor c
          is
            select  sql_text
              into  v_stmt
              from  v$session s,
                    v$process p,
                    v$sqltext_with_newlines t
              where sid = (select sid from v$mystat where rownum = 1)
                and s.paddr = p.addr
                and address = s.sql_address
                and piece <= 20
                and status = 'ACTIVE'
                and rawtohex(sql_address) <> '00'
                and p.username is not null
                and t.sql_text not like '%RAWTOHEX(SQL_ADDRESS)%'
             order by piece;
    begin
        for v_rec in c loop
          v_stmt := v_stmt || v_rec.sql_text || CHR(10);
        end loop;
        return v_stmt;
end;
/ 

SQL> select get_sql from dual;

GET_SQL
--------------------------------------------------------------------------------
select get_sql from dual 


SQL> select  ename,
  2          job,
  3          sal,
  4          get_sql
  5    from emp
  6  /

ENAME      JOB              SAL GET_SQL
---------- --------- ---------- --------------------------------------------------------------------------------
SMITH      CLERK            800 select  ename,
                                        job,
                                        sal,
                                        get_sql
                                  from
                                emp 


ALLEN      SALESMAN        1600 select  ename,
                                        job,
                                        sal,
                                        get_sql

ENAME      JOB              SAL GET_SQL
---------- --------- ---------- --------------------------------------------------------------------------------
                                  from
                                emp 


WARD       SALESMAN        1250 select  ename,
                                        job,
                                        sal,
                                        get_sql
                                  from
                                emp 
.
.
.

SY.

Сообщение было отредактировано: 16 янв 09, 03:19
15 янв 09, 21:37    [6693527]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст выполняемого PL/SQL запроса?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
SQL> create table t(id int);

Table created.

SQL> CREATE OR REPLACE TRIGGER trg$t
  2  BEFORE INSERT OR UPDATE OR DELETE ON t
  3    DECLARE
  4      c_sql_text ora_name_list_t;
  5      c_i int;
  6  BEGIN
  7      DBMS_OUTPUT.PUT_LINE('>>>' || CHR(10) || get_sql || '<<<');
  8  END;
  9  /

Trigger created.

SQL> insert into t values(111);
>>>
insert into t values(111) 
<<<

1 row created.

SQL> 

SY.

Сообщение было отредактировано: 15 янв 09, 21:41
15 янв 09, 21:40    [6693534]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст выполняемого PL/SQL запроса?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
SY
Do not know about RLS. See if this works:


Sorry, function is wrong. We want to eliminate function issued select itself, not just a piece of it with RAWTOHEX(SQL_ADDRESS):

create or replace
  function get_sql
    return clob
    is
        v_stmt clob;
        cursor c
          is
            select  sql_text
              into  v_stmt
              from  v$session s,
                    v$process p,
                    v$sqltext_with_newlines t
              where sid = (select sid from v$mystat where rownum = 1)
                and s.paddr = p.addr
                and address = s.sql_address
                and status = 'ACTIVE'
                and rawtohex(sql_address) <> '00'
                and p.username is not null
                and address not in (
                                    select  t1.address
                                      from  v$sqltext_with_newlines t1
                                      where t1.sql_text like '%listener.get_cmd%'
                                   )
             order by piece;
    begin
        for v_rec in c loop
          v_stmt := v_stmt || v_rec.sql_text || CHR(10);
        end loop;
        return v_stmt;
end;
/ 

SY.

Сообщение было отредактировано: 16 янв 09, 03:31
15 янв 09, 22:14    [6693602]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст выполняемого PL/SQL запроса?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
Never mind. Does not work with all versions.

SY.
16 янв 09, 04:01    [6694185]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст выполняемого PL/SQL запроса?  [new]
stax..
Guest
SY
stax..
кстати как узнать текст селекта в RLS ф-ции
stax


Do not know about RLS. See if this works:

SY.

допустим есть
DBMS_RLS.ADD_POLICY('STAX',tname,'USLZN_BONCIO_S','STAX','uslzn_boncio.zns_boncio','select',FALSE,TRUE);

хотелось бы в ф-ции 'USLZN_BONCIO_S' узнать текст селекта

ps
а зря из обычных триггеров убрали ora_sql_txt, приятная фича была
......
stax
16 янв 09, 09:17    [6694432]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст выполняемого PL/SQL запроса?  [new]
stax..
Guest
SY

Sorry, function is wrong. We want to eliminate function issued select itself, not just a piece of it with RAWTOHEX(SQL_ADDRESS):
SY.

спасибо
попробую
не знал о and status = 'ACTIVE'
......
stax
16 янв 09, 09:25    [6694456]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст выполняемого PL/SQL запроса?  [new]
veel
Member

Откуда:
Сообщений: 10
stax..
veel,

гляньте
ora_sql_txt

зи
слышал что ето баг, но ...

.....
stax


В 10g эта функция, к сожалению, не работает. Было бы действительно удобно.

Для варианта с функцией get_sql требуются какие-либо дополнительные привилегии? Простому пользователю (у которого таблица с триггером хранится) функция возвращает пустое значение.
16 янв 09, 14:31    [6696850]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст выполняемого PL/SQL запроса?  [new]
stax..
Guest
veel
stax..
veel,

гляньте
ora_sql_txt

зи
слышал что ето баг, но ...

.....
stax


В 10g эта функция, к сожалению, не работает. Было бы действительно удобно.

Для варианта с функцией get_sql требуются какие-либо дополнительные привилегии? Простому пользователю (у которого таблица с триггером хранится) функция возвращает пустое значение.

я просто еще не разобрался с 'ACTIVE'
утрируя
напр есть оператор
update t1 ...
в триггере на t1 есть
insert t2
и в триггере на таб t2 надо узнать текст инсерта
......
stax
16 янв 09, 15:39    [6697426]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст выполняемого PL/SQL запроса?  [new]
SQLap
Member [заблокирован]

Откуда:
Сообщений: 34063
veel
Можно ли каким-либо образом в триггере after delete on my_table for each row получить текст PL/SQL, вызвавший операцию удаления в этой таблице?


А мне за писателей Logminer'а обидно. Я какой-то не такой?
19 янв 09, 13:43    [6704666]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить