Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / DDL триггер / 25 сообщений из 41, страница 1 из 2
14.02.2022, 12:53
    #40133942
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DDL триггер
Братцы, лыжи не едут, что делаю не так.

Код: 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
14.02.2022, 13:28
    #40133957
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DDL триггер
Создавать объект в триггере на создание объекта. Да ты гений рекурсии...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.02.2022, 13:59
    #40133971
Asmodeus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DDL триггер
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
14.02.2022, 14:23
    #40133980
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DDL триггер
2 Asmodeus

Спасибо.

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

2 Dimitry Sibiryakov

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

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

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

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


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


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

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

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

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

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

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

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

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


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

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

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


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

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

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

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


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

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

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

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


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


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

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

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

С третьей стороны рекомендации по индексированию Oracle выдает в своих ADDM отчетах уже очень давно (с 10 версии, AFAIR). Читать ADDM Report и применять (возможно, с модификациями) рекомендации - одна из забот ДБА (лучше - совместно с разработчиком). И снова: автоматическое создание индексов в триггерах тут совсем не нужно.
...
Рейтинг: 0 / 0
14.02.2022, 16:26
    #40134021
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DDL триггер
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
14.02.2022, 16:48
    #40134029
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DDL триггер
2 SY

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

SY

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

SY.


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

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

IMHO

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


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

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

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

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

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

Убрал права

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



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


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