Ответы пользователя по тегу Oracle
  • Как посмотреть лог запросов к базе?

    xtender
    @xtender
    По умолчанию выключен, т.к. логгирование всех запросов сожрет много места. При необходимости, конечно, можно временно включить - читайте про аудит: https://docs.oracle.com/cd/E11882_01/server.112/e1...
    Ответ написан
    Комментировать
  • Как вызвать из одного скрипта другой скрипт?

    xtender
    @xtender
    Вот так: orasql.org/2013/04/17/sqlplus-tips-4-branching-exe...
    А вообще у меня есть минисерия SQLPLus tips: orasql.org/category/oracle/sqlplus/sqlplus-tips
    Ответ написан
    Комментировать
  • Как посчитать последовательность при помощи oracle?

    xtender
    @xtender
    with tab1 as (
       select to_date('01.01.2014','dd.mm.yyyy') as    DAY_ID, '000032' as ARTICLE, 1 as QTY from dual union all
       select to_date('02.01.2014','dd.mm.yyyy') as    DAY_ID, '000032' as ARTICLE, 0 as QTY from dual union all
       select to_date('03.01.2014','dd.mm.yyyy') as    DAY_ID, '000032' as ARTICLE, 0 as QTY from dual union all
       select to_date('04.01.2014','dd.mm.yyyy') as    DAY_ID, '000032' as ARTICLE, 1 as QTY from dual union all
       select to_date('05.01.2014','dd.mm.yyyy') as    DAY_ID, '000032' as ARTICLE, 0 as QTY from dual union all
       select to_date('06.01.2014','dd.mm.yyyy') as    DAY_ID, '000032' as ARTICLE, 0 as QTY from dual union all
       select to_date('07.01.2014','dd.mm.yyyy') as    DAY_ID, '000032' as ARTICLE, 0 as QTY from dual union all
       select to_date('08.01.2014','dd.mm.yyyy') as    DAY_ID, '000032' as ARTICLE, 1 as QTY from dual union all
       select to_date('09.01.2014','dd.mm.yyyy') as    DAY_ID, '000032' as ARTICLE, 1 as QTY from dual union all
       select to_date('10.01.2014','dd.mm.yyyy') as    DAY_ID, '000032' as ARTICLE, 0 as QTY from dual union all
       select to_date('11.01.2014','dd.mm.yyyy') as    DAY_ID, '000032' as ARTICLE, 0 as QTY from dual union all
       select to_date('12.01.2014','dd.mm.yyyy') as    DAY_ID, '000032' as ARTICLE, 1 as QTY from dual union all
       select to_date('13.01.2014','dd.mm.yyyy') as    DAY_ID, '000032' as ARTICLE, 0 as QTY from dual
    )
    select 
       t.DAY_ID
      ,t.ARTICLE
      ,t.QTY
      ,decode(qty,0,count(*) over(partition by s order by day_id)) zero_n
    from 
       ( 
        select
           tab1.*
          ,row_number()over(order by day_id) - decode(qty,0,count(*)over(partition by qty order by day_id)) s
        from tab1
       ) t
    order by day_id
    Ответ написан
    Комментировать
  • Как настроить сбор данных из INMEMORY в Oracle 12c?

    xtender
    @xtender
    Смотри по V$IM_SEGMENTS
    Ответ написан
    Комментировать
  • Книга по Oracle Security, есть ли подобные книги направленные на безопасность OracleDB?

    xtender
    @xtender
    Смотри книги/презентации известных спецов по oracle security: Pete Finnigan и Paul Wright. Кое-что интересное писал вроде David Litchfield.

    зы. Я сам, кстати, тоже пару критических уязвимостей нашел в прошлом году в оракле. пофиксили и в кредитсах указали :)
    Ответ написан
    Комментировать
  • Как правильно составить запрос sql?

    xtender
    @xtender
    just for lulz:
    select grantee
    from dba_role_privs
    group by grantee
    having count(*)=2
       and cast(collect(GRANTED_ROLE) as sys.ku$_vcnt) = sys.ku$_vcnt('CONNECT','RESOURCE')

    чуть поскучнее:
    select grantee
    from dba_role_privs
    group by grantee
    having count(*)=2
       and min(GRANTED_ROLE) ='CONNECT'
       and max(GRANTED_ROLE) ='RESOURCE'
    Ответ написан
    Комментировать
  • Как правильно разбить таблицу на partition в Oracle?

    xtender
    @xtender
    Забавно, а где сами даты? ID_DATETIME - это суррогатный ключ на дату в какой-то другой таблице?
    Принципиально, если в таблице нет самого поля секционирования, а есть только суррогат на другую, то можно делать только refence partitioning, а это требует секционирования мастер-таблицы - docs.oracle.com/cd/E11882_01/server.112/e25523/partition.htm#CACIHDII

    Теперь по вопросам:
    1. Как ее правильно разбить на partition по date, если чаще всего отчеты делаются за текущий месяц?

    Кроме отчетов, наверное, еще что-то происходит? :) в целом, необходим целый ряд исследований и тестирований, прежде чем переходить на секционирование.

    И стоит ли делать допустим такое разбиение partition по году затем в subpartition по месяцам.
    не стоит. Если уж режете по дате, то делайте сразу по месяцам, иначе получите лишний оверхед.

    2. Можно ли создание новой партиции сделать автоматическим согласно критерия деления?
    да, смотрите Interval partitioning - docs.oracle.com/cd/E11882_01/server.112/e25523/partition.htm#CACHFHHF

    3. Если структуру перестроить разбить данную таблицу на две.
    Снова Reference partitioning
    Ответ написан
    Комментировать
  • Как сделать кастомный текст ошибки для констрейнта?

    xtender
    @xtender
    Заменить нельзя, но дополнить можно:
    create or replace trigger catch_unique
       after servererror on database
       disable
    declare
       l_sql_text   ora_name_list_t;
       l_msg        varchar2(2000) := null;
       l_stmt       varchar2(2000) := null;
    begin
      if IS_SERVERERROR(1) then
          /* если нужен текст ошибки, запроса и тд:
          for depth in 1 .. ora_server_error_depth loop
            l_msg := l_msg || ora_server_error_msg(depth);
          end loop;
    
          for i in 1 .. ora_sql_txt(sql_text) loop
             l_stmt := l_stmt || sql_text(i);
          end loop;
          */
          raise_application_error(-20001,'Ooops!');
      end if;
    end;
    /
    sho err;
    --если ошибок нет, то включаем:
    alter trigger catch_unique enable;
    --а теперь проверка:
    SQL> insert into xt_unique1 values(1);
    insert into xt_unique1 values(1)
    *
    ERROR at line 1:
    ORA-00604: error occurred at recursive SQL level 1
    ORA-20001: Ooops!
    ORA-06512: at line 16
    ORA-00001: unique constraint (XTENDER.SYS_C0043662) violated
    
    
    Ответ написан
    Комментировать
  • Как собрать ошибки sqlplus?

    xtender
    @xtender
    Когда-то давно создавал триггеры, логгирующие ошибки. Сейчас вот накидал быстро для ваших целей триггер только на схему(можете сами поменять на on database):
    orasql.org/scripts/errlog_ddl.sql
    Если этот скрипт после выполнения не выдает ошибок, то включайте триггер и гоните свой скрипт. Пример:
    1. Устанавливаем триггер:
    SQL> @tests/errlog_ddl.sql
    
    Table created.
    
    
    Sequence created.
    
    
    Trigger created.
    
    No errors.
    
    

    2. Так как ошибок на предыдущем этапе не было, то включаем триггер:
    SQL> alter trigger tr_errorlog enable;
    
    Trigger altered.
    

    3. Проверяем, выполняя инсерт в несуществующую таблицу:
    SQL> insert into nonexistent values(1);
    insert into nonexistent values(1)
                *
    ERROR at line 1:
    ORA-00942: table or view does not exist
    

    4. Смотрим ошибки:
    SQL> col err_sql format a50
    SQL> select id,err_level, err_sql from errorlog;
    
            ID  ERR_LEVEL ERR_SQL
    ---------- ---------- -----------------------------------
             1          1 insert into nonexistent values(1)
    
    Ответ написан
    2 комментария