powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / DDL триггер
25 сообщений из 41, страница 1 из 2
DDL триггер
    #40133942
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Братцы, лыжи не едут, что делаю не так.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
-- Юзер  
CREATE USER "MYUSER" IDENTIFIED BY 123  ;  
    
-- Права
GRANT CONNECT TO MYUSER ;  
GRANT CREATE TABLE TO MYUSER ;
GRANT CREATE TRIGGER TO MYUSER ;
GRANT CREATE ANY INDEX TO MYUSER ;

-- DDL триггер
create or replace NONEDITIONABLE TRIGGER MYUSER.MYUSER_CREATE_TABLE_INDEX
AFTER CREATE ON MYUSER.SCHEMA

    DECLARE
    cSQL varchar2(4000 CHAR);
   BEGIN
    cSQL := 'create index MYUSER.idx_test on MYUSER.test(f1)';
    EXECUTE IMMEDIATE cSQL;

   END MYUSER_CREATE_TABLE_INDEX;

-- Выполняю от юзера MYUSER
create table  MYUSER.test (f1 nvarchar2(10));

-- Получаю ошибку
rror starting at line : 1 in command -
create table  MYUSER.test (f1 nvarchar2(10))
Error report -
ORA-04088: ошибка во время выполнения триггера 'MYUSER.MYUSER_CREATE_TABLE_INDEX'
ORA-00604: ошибка на рекурсивном SQL-уровне 1
ORA-30511: неверная DDL операция в системных триггерах
04088. 00000 -  "error during execution of trigger '%s.%s'"
*Cause:    A runtime error occurred during execution of a trigger.
*Action:   Check the triggers which were involved in the operation.




В "упор" не пойму где ошибка??
...
Рейтинг: 0 / 0
DDL триггер
    #40133957
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создавать объект в триггере на создание объекта. Да ты гений рекурсии...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DDL триггер
    #40133971
Asmodeus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist
Братцы, лыжи не едут, что делаю не так.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
-- Юзер  
CREATE USER "MYUSER" IDENTIFIED BY 123  ;  
    
-- Права
GRANT CONNECT TO MYUSER ;  
GRANT CREATE TABLE TO MYUSER ;
GRANT CREATE TRIGGER TO MYUSER ;
GRANT CREATE ANY INDEX TO MYUSER ;

-- DDL триггер
create or replace NONEDITIONABLE TRIGGER MYUSER.MYUSER_CREATE_TABLE_INDEX
AFTER CREATE ON MYUSER.SCHEMA

    DECLARE
    cSQL varchar2(4000 CHAR);
   BEGIN
    cSQL := 'create index MYUSER.idx_test on MYUSER.test(f1)';
    EXECUTE IMMEDIATE cSQL;

   END MYUSER_CREATE_TABLE_INDEX;

-- Выполняю от юзера MYUSER
create table  MYUSER.test (f1 nvarchar2(10));

-- Получаю ошибку
rror starting at line : 1 in command -
create table  MYUSER.test (f1 nvarchar2(10))
Error report -
ORA-04088: ошибка во время выполнения триггера 'MYUSER.MYUSER_CREATE_TABLE_INDEX'
ORA-00604: ошибка на рекурсивном SQL-уровне 1
ORA-30511: неверная DDL операция в системных триггерах
04088. 00000 -  "error during execution of trigger '%s.%s'"
*Cause:    A runtime error occurred during execution of a trigger.
*Action:   Check the triggers which were involved in the operation.




В "упор" не пойму где ошибка??

В дополнение к предыдущему замечанию (как минимум напрашивается секция WHEN (ora_dict_obj_type='TABLE'), чтобы не срабатывал на прочих объектах), расширенное сообщение об ошибке гласит:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
[oracle@ol8db193 ~]$ oerr ora 30511
30511, 00000, "invalid DDL operation in system triggers"
// *Cause:  An attempt was made to perform an invalid DDL operation
//          in a system trigger. Most DDL operations currently are not
//          supported in system triggers. The only currently supported DDL
//          operations are table operations, pluggable database operations,
//          ALTER COMPILE operations, and ALTER SESSION operations.
// *Action: Remove invalid DDL operations in system triggers.


CREATE INDEX не предусмотрен.
...
Рейтинг: 0 / 0
DDL триггер
    #40133980
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Asmodeus

Спасибо.

Тогда уточняющий вопрос, как создать индекс на табличку используя системные события (как вариант повесить шедулер, но не хотелось бы)??

2 Dimitry Sibiryakov

Дык, "я не волшебник, я только учусь " (с) к/ф Золушка

Оракл увидел впервые 3 месяца назад :((
...
Рейтинг: 0 / 0
DDL триггер
    #40133986
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWistТогда уточняющий вопрос, как создать индекс на табличку используя системные
события (как вариант повесить шедулер, но не хотелось бы)??

Во-первых, никак.
Во-вторых, даже если ты найдёшь проктостоматологический способ, это будет
диверсия, поскольку лишние индексы в базе - зло.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DDL триггер
    #40133989
PuM256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist
2 Asmodeus
Тогда уточняющий вопрос, как создать индекс на табличку используя системные события

Извиняюсь, зачем?
...
Рейтинг: 0 / 0
DDL триггер
    #40133990
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov


Во-первых, никак.
Во-вторых, даже если ты найдёшь проктостоматологический способ, это будет
диверсия, поскольку лишние индексы в базе - зло.


1. ОК, спасибо ( уже сам понял, нашел).

2. Нуу, как бы... у тебя запрос выполнялся 15 мин, а стал выполняться за 3 сек, а так индексы конечно зло
...
Рейтинг: 0 / 0
DDL триггер
    #40133992
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

PaulWistТогда уточняющий вопрос, как создать индекс на табличку используя системные
события (как вариант повесить шедулер, но не хотелось бы)??

Во-первых, никак.
Во-вторых, даже если ты найдёшь проктостоматологический способ, это будет
диверсия, поскольку лишние индексы в базе - зло.
Осталось только научиться отличать "лишние" индексы от "нелишних". :-)

P. S. На Exadata можно использовать Automatic Indexing , но делать это нужно осторожно.
...
Рейтинг: 0 / 0
DDL триггер
    #40133993
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWistНуу, как бы... у тебя запрос выполнялся 15 мин, а стал выполняться за 3 сек

Какой запрос если ты таблицу только создаёшь? Твой триггер должен обладать даром
предвидения чтобы в момент создания таблицы предвидеть запросы к ней. Не говоря
уже об искусственном интеллекте чтобы распознать поля, которые необходимо
проиндексировать для ускорения этого запроса.

"Нет, сынок, это фантастика." (с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
DDL триггер
    #40133994
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist

2. Нуу, как бы... у тебя запрос выполнялся 15 мин, а стал выполняться за 3 сек, а так индексы конечно зло


И поэтому индексы надо создавать налету?

SY.
...
Рейтинг: 0 / 0
DDL триггер
    #40133996
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PuM256
PaulWist
2 Asmodeus
Тогда уточняющий вопрос, как создать индекс на табличку используя системные события

Извиняюсь, зачем?


Да, блин, "коробочная" система а-ля 1С на СУБД Oracle, MSSQL, Informix итп с "индусским кодом", в ней есть такое безобразие как перегрузить таблицу (причём местные программёры её часто используют, нафига мне не понятно), фактически табличка выгружается в файл, убивается drop table со всеми атрибутами, а затем создаётся из своих метаданных, причем например индексы могут создаваться только как create index idx on table (f1, f2...) создать индекс DECODE(f1) уже не может, вот приходиться искать методы обойти индусов
...
Рейтинг: 0 / 0
DDL триггер
    #40133997
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

PaulWistНуу, как бы... у тебя запрос выполнялся 15 мин, а стал выполняться за 3 сек

Какой запрос если ты таблицу только создаёшь? Твой триггер должен обладать даром
предвидения чтобы в момент создания таблицы предвидеть запросы к ней. Не говоря
уже об искусственном интеллекте чтобы распознать поля, которые необходимо
проиндексировать для ускорения этого запроса.

"Нет, сынок, это фантастика." (с)


Иии что?? Если таблица создаётся, то для неё уже, как правило, известны запросы, (PK/FK), ... нет ну если создать таблицу, а затем ждать тормозов, ... тоже метод.
...
Рейтинг: 0 / 0
DDL триггер
    #40133999
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist
Dimitry Sibiryakov

пропущено...

Какой запрос если ты таблицу только создаёшь? Твой триггер должен обладать даром
предвидения чтобы в момент создания таблицы предвидеть запросы к ней. Не говоря
уже об искусственном интеллекте чтобы распознать поля, которые необходимо
проиндексировать для ускорения этого запроса.

"Нет, сынок, это фантастика." (с)


Иии что?? Если таблица создаётся, то для неё уже, как правило, известны запросы, (PK/FK), ... нет ну если создать таблицу, а затем ждать тормозов, ... тоже метод.
Точно!
В этом случае как раз и помогает автоматическое индексирование!
Но не всем. А только владельцам БД современных версий на платформе Exadata.
...
Рейтинг: 0 / 0
DDL триггер
    #40134002
Asmodeus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist
Да, блин, "коробочная" система а-ля 1С
Вот именно, что коробочная система, где требуемые индексы строят разработчики коробочки , предполагая, какие запросы будут прилетать в БД (исходя из выдаваемых наружу - пользователю, - функций). Это не БД сама занимается прикладным индексостроением от скуки (Autonomous Database не берем в расчет, там все не однозначно, хотя и довольно интересно в режиме "REPORT ONLY").
...
Рейтинг: 0 / 0
DDL триггер
    #40134011
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--
...
Рейтинг: 0 / 0
DDL триггер
    #40134016
rpovarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В порядке бреда - в триггере запланировать задачу через Scheduler, и в той задаче уже создать индекс.
Пардон, плохо читал, автором же и предлагалось.
Но вполне рабочий вариант, если повесить триггер на создание таблицы.
...
Рейтинг: 0 / 0
DDL триггер
    #40134018
Asmodeus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist
Asmodeus
пропущено...
Вот именно, что коробочная система, где требуемые индексы строят разработчики коробочки , предполагая, какие запросы будут прилетать в БД (исходя из выдаваемых наружу - пользователю, - функций). Это не БД сама занимается прикладным индексостроением от скуки (Autonomous Database не берем в расчет, там все не однозначно, хотя и довольно интересно в режиме "REPORT ONLY").


Блин, ты уж определись, то таблицу создали зачем индексы, то таблицу создали индексы нужны.

Как тебя понять Абдула (с) Белое солнце пустыни
Никаких противоречий: индексы создают те, кто понимает (или предполагается, что понимает), зачем и как они будут использованы. И использовать для этого триггеры совсем не нужно, разработчик один раз ручками прописывает их создание.

В Autonomous Database в роли "Знайки" выступает сама БД на основе частоты выполнения тех или иных запросов: вы спрашивайте, что хотите, а я прикину, как эффективнее вам это выдавать. Подход имеет право на жизнь в текущих условиях развития Low-Code приложений и отношению к БД как к черному ящику со стороны разработчика.

С третьей стороны рекомендации по индексированию Oracle выдает в своих ADDM отчетах уже очень давно (с 10 версии, AFAIR). Читать ADDM Report и применять (возможно, с модификациями) рекомендации - одна из забот ДБА (лучше - совместно с разработчиком). И снова: автоматическое создание индексов в триггерах тут совсем не нужно.
...
Рейтинг: 0 / 0
DDL триггер
    #40134021
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov


Во-первых, никак.


Ну почему-же:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CREATE OR REPLACE
  TRIGGER MYUSER_CREATE_TABLE_INDEX_TRG
    AFTER CREATE
    ON DATABASE
    BEGIN
        IF     ORA_DICT_OBJ_OWNER = 'SCOTT'
           AND
               ORA_DICT_OBJ_TYPE = 'TABLE'
          THEN
            DBMS_SCHEDULER.CREATE_JOB(
                                      JOB_NAME   => 'J' || SYS_GUID(),
                                      JOB_TYPE   => 'PLSQL_BLOCK',
                                      JOB_ACTION => 'BEGIN EXECUTE IMMEDIATE ''CREATE INDEX ' ||
                                                    ORA_DICT_OBJ_OWNER || '.' || ORA_DICT_OBJ_NAME ||
                                                    '_IDX ON ' ||
                                                    ORA_DICT_OBJ_OWNER || '.' || ORA_DICT_OBJ_NAME ||
                                                    '(N)''; END;',
                                      ENABLED    => TRUE
                                    );
        END IF;
END;
/




Теперь:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SQL> create table tbl1(n number);

Table created.

SQL> select  index_owner,
  2          index_name,
  3          column_name
  4    from  dba_ind_columns
  5    where table_owner = 'SCOTT'
  6      and table_name = 'TBL1'
  7  /

INDEX_OWNER INDEX_NAME  COLUMN_NAME
----------- ----------- -----------
SCOTT       TBL1_IDX    N

SQL>



Другой вопрос зачем?

SY.
...
Рейтинг: 0 / 0
DDL триггер
    #40134029
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SY

Браво, пойдёт!!!

SY

Другой вопрос зачем?

SY.


автор"коробочная" система а-ля 1С на СУБД Oracle, MSSQL, Informix итп с "индусским кодом", в ней есть такое безобразие как перегрузить таблицу (причём местные программёры её часто используют, нафига мне не понятно), фактически табличка выгружается в файл, убивается drop table со всеми атрибутами, а затем создаётся из своих метаданных, причем например индексы могут создаваться только как create index idx on table (f1, f2...) создать индекс DECODE(f1) уже не может,
...
Рейтинг: 0 / 0
DDL триггер
    #40134033
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут вижу только одну проблему, если в коде CREATE TABLE и дальше сразу бизнес-код (INSERT/SELECT'ы), то вполне возможно, что в каких-то случаях пауза (ассинхронность) между CREATE TABLE и CREATE INDEX может оказаться критической.

Как рабочий вариант, решение кривое. Как костыль и заплатка - ну а куда деваться )))

IMHO

p.s.
в новый год переписывал код конкарента от OeBS, вроде 3-и года работало, а сейчас столкнулись, что когда запуск конкарента совпал со сбором статистики, все сломалось колом (и почти неделю не работало, пока админы что-то на проде не подшаманили). В результате конкарент переписали.
...
Рейтинг: 0 / 0
DDL триггер
    #40134042
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Тут вижу только одну проблему, если в коде CREATE TABLE и дальше сразу бизнес-код (INSERT/SELECT'ы), то вполне возможно, что в каких-то случаях пауза (ассинхронность) между CREATE TABLE и CREATE INDEX может оказаться критической.


ТС всегда может добавить DBMS_LOCK.SLEEP после DBMS_SCHEDULER.CREATE_JOB.

SY.
...
Рейтинг: 0 / 0
DDL триггер
    #40134053
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.
...
Рейтинг: 0 / 0
DDL триггер
    #40134054
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще, это задача и проблема фирмы разработчика прикладного софта. Разумеется, в том случае, если поддержка и сопровождении оплачены. Задача админа скорее диагностировать проблему и профессионально-технически объяснить ее фирме разработчику.

При этом, вполне есть вероятность, что в прикладной системе уже даже есть нужный чекбокс "работать быстро", но его просто забыли нажать или просто не догадываются, что он существует

IMHO
...
Рейтинг: 0 / 0
DDL триггер
    #40134187
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё вопрос по ходу дела.

Если в DDL триггере использовать DBMS_SCHEDULER.CREATE_JOB, то имени кого/какого юзера JOB будет выполняться?? (как это посмотреть??)

Убрал права

Код: plsql
1.
2.
3.
grant create any index to MYUSER;
-- была некоторая неоднозначность :)
revoke create any index from MYUSER



НО индекс всё равно создаётся...
...
Рейтинг: 0 / 0
DDL триггер
    #40134292
serpv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWist,
"create any index" для создания в своей схеме не нужна.
...
Рейтинг: 0 / 0
25 сообщений из 41, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / DDL триггер
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]