Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как запретить выполнение запроса  [new]
Тakko
Guest
Всем привет.
Подскажите плиз, можно ли как-то запретить всем пользователям выполнение определенного запроса, например по sql_id.
Права на таблицы отобрать нельзя.
27 мар 14, 21:33    [15797482]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить выполнение запроса  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10043
Как вариант DECLARE_REWRITE_EQUIVALENCE Procedures


SY.
27 мар 14, 23:35    [15797919]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить выполнение запроса  [new]
Тakko
Guest
SY
Как вариант DECLARE_REWRITE_EQUIVALENCE Procedures


SY.


Ух-ты, это даже круче, чем я мог надеяться.
Большое спасибо!
28 мар 14, 13:20    [15800426]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить выполнение запроса  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
Тakko,

+ dbms_sql_translator
SQL> def bad_qry="select 'bad_one' from dual"
SQL> def translated_qry="select 1/0 from dual"
SQL> exec dbms_sql_translator.create_profile( 'bad_qry_profile')

PL/SQL procedure successfully completed.

SQL> exec dbms_sql_translator.register_sql_translation( 'bad_qry_profile', q'#&bad_qry.#', '&translated_qry.')

PL/SQL procedure successfully completed.

SQL> alter session set events '10601 trace name context forever, level 32';

Session altered.

SQL> select 'bad_one' from dual;

'BAD_ON
-------
bad_one

SQL> select 'bad_one' from dual;

'BAD_ON
-------
bad_one

SQL> select dummy from dual;

D
-
X

SQL> alter session set sql_translation_profile=bad_qry_profile;

Session altered.

SQL> select 'bad_one' from dual;
select 'bad_one' from dual
        *
ERROR at line 1:
ORA-01476: divisor is equal to zero


+ на посмеяться
SQL> def query="select 'bad_one' from dual"
SQL> col sql_id new_v sql_id
SQL> select sys.dbms_sqltune_util0.sqltext_to_sqlid(q'#&query.#'||chr(0)) sql_id from dual;
old   1: select sys.dbms_sqltune_util0.sqltext_to_sqlid(q'#&query.#'||chr(0)) sql_id from dual
new   1: select sys.dbms_sqltune_util0.sqltext_to_sqlid(q'#select 'bad_one' from dual#'||chr(0)) sql_id from dual

SQL_ID
--------------------------------------------------------------------------------
c3draawmv257x

SQL> alter session set events 'sql_trace [sql: &sql_id.] crash';
old   1: alter session set events 'sql_trace [sql: &sql_id.] crash'
new   1: alter session set events 'sql_trace [sql: c3draawmv257x] crash'

Session altered.

SQL> select 'good_one' from dual;

'GOOD_ON
--------
good_one

SQL> select dummy from dual;

D
-
X

SQL> select
  2  #1 &query.
  2  /
old   1: &query.
new   1: select 'bad_one' from dual
select 'bad_one' from dual
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 3757
Session ID: 435 Serial number: 1851
10 апр 14, 18:27    [15864224]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить выполнение запроса  [new]
Деев И.
Member

Откуда: отсюда
Сообщений: 783
SY
Как вариант DECLARE_REWRITE_EQUIVALENCE Procedures


SY.


жаль вот только с bind-переменными облом
10 апр 14, 18:47    [15864333]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить выполнение запроса  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
SeaGate
ORA-03113: end-of-file on communication channel
Не воспроизводится.
SQL> exec dbms_sql_translator.create_profile('profile0');

PL/SQL procedure successfully completed.

SQL> exec dbms_sql_translator.register_sql_translation('profile0', q'#select 'bad_one' from dual#', 'select 1/0 from dual');

PL/SQL procedure successfully completed.

SQL> alter session set sql_translation_profile=profile0;

Session altered.

SQL> alter session set events '10601 trace name context forever, level 32';

Session altered.

SQL> def query="select 'bad_one' from dual"
SQL> select
  2  #1 &query.
  2  /
old   1: &query.
new   1: select 'bad_one' from dual
select 'bad_one' from dual
        *
ERROR at line 1:
ORA-01476: divisor is equal to zero
Но непонятно к чему лишние сложности.
1. Зачем после переменных подстановки ставить точку?
2. Что означает crash в sql_trace?
И вообще непонятно желание тестить экзотический функционал в корявом синтаксисе типа:
SQL> select
  2  # select * from dual
  2  /

D
-
X
13 апр 14, 18:34    [15875503]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить выполнение запроса  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
Если понамешать всего в кучу, что написано в oradebug doc, то эффекта достичь весьма просто:
Connected.
SQL> alter session set events 'sql_trace crash';
alter session set events 'sql_trace crash'
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 6172
Session ID: 372 Serial number: 517
13 апр 14, 18:44    [15875540]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить выполнение запроса  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
SeaGate
на посмеяться
Я просто не понял юмора изначально.
13 апр 14, 19:04    [15875591]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить выполнение запроса  [new]
Тakko
Guest
Деев И.
SY
Как вариант DECLARE_REWRITE_EQUIVALENCE Procedures


SY.


жаль вот только с bind-переменными облом


Ага. А мне жаль, что с group by не работает.
16 апр 14, 17:09    [15892122]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить выполнение запроса  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10043
Тakko
А мне жаль, что с group by не работает.


Покажи.

SY.
16 апр 14, 20:10    [15892829]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить выполнение запроса  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
dbms_photoshop,

dbms_photoshop
Не воспроизводится.

с dbms_sql_translator воспроизводили ORA-01476. Как видно в Вашем листинге, это и воспроизвелось.

dbms_photoshop
Но непонятно к чему лишние сложности.
1. Зачем после переменных подстановки ставить точку?

Явное завершение переменной подстановки.
http://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_five.htm#sthref458

dbms_photoshop
2. Что означает crash в sql_trace?

Завершение серверного процесса.

dbms_photoshop
Если понамешать всего в кучу, что написано в oradebug doc, то эффекта достичь весьма просто:

Достигнутый эффект как-то связан с завершением определенного запроса?
В моем примере связан.

dbms_photoshop
И вообще непонятно желание тестить экзотический функционал в корявом синтаксисе типа:

На вкус и цвет...
Вы как предпочитаете выполнять запросы, заданные в переменных подстановки?
18 апр 14, 16:10    [15902200]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить выполнение запроса  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
SeaGate
На вкус и цвет...
Вы как предпочитаете выполнять запросы, заданные в переменных подстановки?
Я предпочитаю не усложнять без надобности.
SQL> #1 &stmt
SQL> /
Enter value for stmt: select * from dual
old   1: &stmt
new   1: select * from dual

D
-
X
А то так можно прийти и к
SQL> drop
  2  #1 &stmt
  2  /
Enter value for stmt: select * from dual
old   1: &stmt
new   1: select * from dual

D
-
X
Тем не менее, мне сложно представить практическую задачу с подобной необходимостью.
18 апр 14, 16:56    [15902449]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить выполнение запроса  [new]
Тakko
Guest
SY
Тakko
А мне жаль, что с group by не работает.


Покажи.

SY.


Тьфу-ты, не group by, а order by.
Извините, я чего-то зарапортовался.

SQL> create table dbsnmp_tables as select * from dba_tables where owner = 'DBSNMP';

Table created.

SQL> begin
dbms_stats.gather_table_stats(ownname=>'DBA_TEST', tabname=>'DBSNMP_TABLES', cascade=> TRUE);
end;
/  2    3    4

PL/SQL procedure successfully completed.

SQL> ALTER SESSION SET query_rewrite_integrity = trusted;

Session altered.

SQL> begin
  sys.dbms_advanced_rewrite.declare_rewrite_equivalence (
  'test1',
  'select table_name,num_rows from dbsnmp_tables',
  'select ''NOTHING'',0 from dual',
  false,
  'text_match');
end;
/  2    3    4    5    6    7    8    9

PL/SQL procedure successfully completed.

SQL> select table_name,num_rows from dbsnmp_tables;

TABLE_N   NUM_ROWS
------- ----------
NOTHING          0

SQL> begin
  sys.dbms_advanced_rewrite.declare_rewrite_equivalence (
  'test2',
  'select table_name,num_rows from dbsnmp_tables order by num_rows',
  'select ''NOT_ALLOWED'',0 from dual',
  false,
  'text_match');
end;
/  2    3    4    5    6    7    8    9
begin
*
ERROR at line 1:
ORA-30389: the source statement is not compatible with the destination statement
ORA-00907: missing right parenthesis
ORA-06512: at "SYS.DBMS_ADVANCED_REWRITE", line 29
ORA-06512: at "SYS.DBMS_ADVANCED_REWRITE", line 185
ORA-06512: at line 2


SQL> begin
  sys.dbms_advanced_rewrite.declare_rewrite_equivalence (
  'test3',
  'select table_name,num_rows from dbsnmp_tables)',
  'select table_name,num_rows from dbsnmp_tables order by num_rows',
  false,
  'text_match');
end;
/  2    3    4    5    6    7    8    9
begin
*
ERROR at line 1:
ORA-30389: the source statement is not compatible with the destination statement
ORA-00933: SQL command not properly ended
ORA-06512: at "SYS.DBMS_ADVANCED_REWRITE", line 29
ORA-06512: at "SYS.DBMS_ADVANCED_REWRITE", line 185
ORA-06512: at line 2
18 апр 14, 23:04    [15903690]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить выполнение запроса  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10043
Тakko,

SQL> begin
  2    sys.dbms_advanced_rewrite.declare_rewrite_equivalence (
  3    'test1',
  4    'select table_name,num_rows from dbsnmp_tables',
  5    'select ''NOT_ALLOWED'' table_name,0 num_rows from dual',
  6    false,
  7    'text_match');
  8  end;
  9  /

PL/SQL procedure successfully completed.

SQL> select table_name,num_rows from dbsnmp_tables;

TABLE_NAME    NUM_ROWS
----------- ----------
NOT_ALLOWED          0

SQL> select table_name,num_rows from dbsnmp_tables order by num_rows;

TABLE_NAME    NUM_ROWS
----------- ----------
NOT_ALLOWED          0

SQL> select table_name,num_rows from dbsnmp_tables order by table_name;

TABLE_NAME    NUM_ROWS
----------- ----------
NOT_ALLOWED          0

SQL>  


ORDER BY выполняется над resultset и посему к query rewrite никакого отношения не имеет. То же относится и к аналитике:

SQL> select table_name,num_rows, count(*) over() from dbsnmp_tables;

TABLE_NAME    NUM_ROWS COUNT(*)OVER()
----------- ---------- --------------
NOT_ALLOWED          0              1

SQL> select table_name,num_rows, count(*) over() from dbsnmp_tables order by 3;

TABLE_NAME    NUM_ROWS COUNT(*)OVER()
----------- ---------- --------------
NOT_ALLOWED          0              1

SQL> 


Но с другой стороны GROUP BY и MODEL также выполняются над resultset...

SY.
18 апр 14, 23:42    [15903763]     Ответить | Цитировать Сообщить модератору
 Re: Как запретить выполнение запроса  [new]
Тakko
Guest
SY,

да, но это не поможет в том случае, если нужно, чтобы запрос без order by выполнялся, а с order by - нет.
Но и без того это длоя меня ценная и полезная штуковина.
19 апр 14, 03:07    [15904037]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить