Показаны сообщения с ярлыком database. Показать все сообщения
Показаны сообщения с ярлыком database. Показать все сообщения

вторник, 22 сентября 2015 г.

Write parse failures to alert log file (ORA-10035)

Если нужно временно найти какой-то запрос который выбрасывает ошибку парсинга в приложении, можно воспользоваться следующим event'ом что бы увидеть текст:

oerr ora 10035
10035, 00000, "Write parse failures to alert log file"

Пробуем:

SQL> alter system set events '10035 trace name context forever, level 1';

System altered.

SQL> select 1 form dual;
select 1 form dual
              *
ERROR at line 1:
ORA-00923: FROM keyword not found where expected

SQL> select owner,object_name,count(1) from dba_objects where owner='SYS' group by owner order by 3 desc;
select owner,object_name,count(1) from dba_objects where owner='SYS' group by owner order by 3 desc
             *
ERROR at line 1:
ORA-00979: not a GROUP BY expression

SQL>  alter system set events '10035 trace name context forever, off';

Проверяем наш alert.log:

OS Pid: 9040 executed alter system set events '10035 trace name context forever, level 1'
Tue Sep 22 19:57:01 2015
PARSE ERROR: ospid=9040, error=923 for statement:
Tue Sep 22 19:57:01 2015
select 1 form dual
Additional information: hd=0x150fc6bc8 phd=0x15227b9e0 flg=0x28 cisid=0 sid=0 ciuid=0 uid=0
PARSE ERROR: ospid=9040, error=979 for statement:
Tue Sep 22 19:57:05 2015
select owner,object_name,count(1) from dba_objects where owner='SYS' group by owner order by 3 desc
Additional information: hd=0x15083b580 phd=0x1508160f0 flg=0x20 cisid=0 sid=0 ciuid=0 uid=0
Tue Sep 22 19:58:37 2015
OS Pid: 9040 executed alter system set events '10035 trace name context forever, off'

понедельник, 7 сентября 2015 г.

ORA-01866: the datetime class is invalid

Небольшой пример того как можно получить ORA-01866 при вызове удаленного модуля через database link.
Все действия производим под пользователем test(create session,create database link,create procedure).
Создадим тестовую процедуру с выходным параметром:
SQL> create or replace procedure  test.testproc(vvv out timestamp)
  2  as
  3  begin
  4  null;
  5  return;
  6  end;
  7  /

Procedure created.

Далее создадим database link, для демонстрации, просто на самого себя:
SQL> create database link testlink using '(description=(address_list=(address=(protocol=tcp)(host=localhost)(port=1521)))(connect_data=(server=dedicated)(sid=orcl)))';

Database link created.

И выполним небольшой блок для того что бы получить ошибку:
SQL> declare
  2  myts timestamp;
  3  begin
  4  test.testproc@testlink(myts);
  5  end;
  6  /
declare
*
ERROR at line 1:
ORA-01866: the datetime class is invalid
ORA-06512: at line 4
Конечно, мы специально не присваивали переменной vvv в теле процедуры никаких значений, что и повлекло подобную ошибку при обращении через dblink.
При этом, без dblink'а все работает хорошо:
SQL> declare
  2  myts timestamp;
  3  begin
  4  test.testproc(myts);
  5  end;
  6  /

PL/SQL procedure successfully completed.
Поправим процедуру:
SQL> create or replace procedure  test.testproc(vvv out timestamp)
  2  as
  3  begin
  4  vvv:=null;
  5  return;
  6  end;
  7  /

Procedure created.
И повторим эксперимент:
SQL> declare
  2  myts timestamp;
  3  begin
  4  test.testproc@testlink(myts);
  5  end;
  6  /

PL/SQL procedure successfully completed.
Ошибка больше не возникает.

понедельник, 19 мая 2014 г.

Oracle database 12c security enhancements

Рассмотрим новые для 12c системные привелегии "inherit [any] privileges".

Для проверки нам понадобится небольшая заготовка:

create user test1 identified by test default tablespace users;
grant create session to test1;
grant create table to test1;
alter user test1 quota 100M on users;
create table test1.testtab(c0 number not null);
create user test2 identified by test default tablespace users;
grant create session to test2;
grant create procedure to test2;
grant create view to test2;



Так как по-умолчанию привилегия "inherit privileges" выдана PUBLIC'у, мы ее отберем:

revoke inherit privileges on user test1 from public;

Согласно документации, системная привелегия "inherit [any] privileges" контроллирует набор привелегий доступных процедурам/функциям
запускаемым с правами вызывающего пользователя(authid current_user).
Пользователь test2 в нашем случае, обладает более узким набором прав в бзе данных и он будет создавать у себя различные объекты,
предоставляя доступ к ним для пользователя test1.

create or replace procedure test2.testproc authid current_user as
begin
for i in 1..100 loop
execute immediate 'insert into test1.testtab(c0) values('||round(dbms_random.value(0,100))||')';
end loop;
commit;
end;
/
grant execute on test2.testproc to test1;

Итак, в процедуре мы пытаемся внести записи в таблицу пользователя test1, процедура объявлена как исполняющаяся с правами вызывающего пользователя,
inherit privileges для test1 мы отняли.
Теперь вызовем эту процедуру из-под пользователя test1:

SQL> exec test2.testproc;
BEGIN test2.testproc; END;

*
ERROR at line 1:
ORA-06598: insufficient INHERIT PRIVILEGES privilege
ORA-06512: at "TEST2.TESTPROC", line 1
ORA-06512: at line 1

Но если бы мы не отняли inherit privileges для test1 у PUBLIC'а или выдали бы inherit any privileges пользователю test2, то ошибки бы не было.
Дадим test2 привилегию наследовать права от test1:

SQL> grant inherit privileges on user test1 to test2;

Grant succeeded.

SQL> exec test2.testproc;

PL/SQL procedure successfully completed.

Эта привилегия также будет актуальна при создании представлений с использованием функций использующих права вызываемого пользователя:

create or replace function test2.testfunc return number authid current_user as
retval number;
begin
execute immediate 'select max(c0) from test1.testtab' into retval;
return retval;
exception when others then return null;
end;
/
create or replace view test2.testview1 bequeath definer as select testfunc() c0 from dual;
create or replace view test2.testview2 bequeath current_user as select testfunc() c0 from dual;
grant select on test2.testview1 to test1;
grant select on test2.testview2 to test1;

Представление test2.testview1 ожидаемо не будет работать, будучи объявленным как bequeath definer,
функция, вызываемая в приложении будет выдавать ошибку, т.к. прав на test1.testtab у пользователя test2 нет:

SQL> select * from test2.testview1;
select * from test2.testview1
       *
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at "TEST2.TESTFUNC", line 4

Проверим как это работает под пользователем test1 для представления объявленного как bequeath current_user:

SQL> revoke inherit privileges on user test1 from test2;

Revoke succeeded.

SQL> select * from test2.testview2;
select * from test2.testview2
                    *
ERROR at line 1:
ORA-06598: insufficient INHERIT PRIVILEGES privilege

SQL> grant inherit privileges on user test1 to test2;

Grant succeeded.

SQL> select * from test2.testview2;

              C0
----------------
             100

понедельник, 5 августа 2013 г.

Oracle 12c new features: pga_aggregate_limit

В версии 12с появилась возможность задавать жесткое ограничение на размер PGA. 
Раньше такой возможности, порой, не хватало.
Отвечает за это параметр pga_aggregate_limit.
Стоит обратить внимание, что этот параметр не играет роли для пользователя SYS и для фоновых процессов.