DDL триггер

PaulWist
Дата: 14.02.2022 12:53:39
Братцы, лыжи не едут, что делаю не так.

-- Юзер  
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.



В "упор" не пойму где ошибка??
Dimitry Sibiryakov
Дата: 14.02.2022 13:28:58

Создавать объект в триггере на создание объекта. Да ты гений рекурсии...

Posted via ActualForum NNTP Server 1.5

Asmodeus
Дата: 14.02.2022 13:59:27
PaulWist
Братцы, лыжи не едут, что делаю не так.

-- Юзер  
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'), чтобы не срабатывал на прочих объектах), расширенное сообщение об ошибке гласит:
[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 не предусмотрен.
PaulWist
Дата: 14.02.2022 14:23:28
2Asmodeus

Спасибо.

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

2Dimitry Sibiryakov

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

Оракл увидел впервые 3 месяца назад :((
Dimitry Sibiryakov
Дата: 14.02.2022 14:46:32

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

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

Posted via ActualForum NNTP Server 1.5

PuM256
Дата: 14.02.2022 15:06:57
PaulWist
2Asmodeus
Тогда уточняющий вопрос, как создать индекс на табличку используя системные события

Извиняюсь, зачем?
PaulWist
Дата: 14.02.2022 15:10:59
Dimitry Sibiryakov


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


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

2. Нуу, как бы... у тебя запрос выполнялся 15 мин, а стал выполняться за 3 сек, а так индексы конечно зло
SQL*Plus
Дата: 14.02.2022 15:15:40
Dimitry Sibiryakov

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

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

P. S. На Exadata можно использовать Automatic Indexing, но делать это нужно осторожно.
Dimitry Sibiryakov
Дата: 14.02.2022 15:16:16

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

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

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

Posted via ActualForum NNTP Server 1.5

SY
Дата: 14.02.2022 15:18:40
PaulWist

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


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

SY.