Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 DDL в триггере  [new]
ananax
Member

Откуда: MO
Сообщений: 424
День добрый!
Подскажите, как можно создать пользователя в базе из триггера не выполняя коммита?
что делаю:
На добавление/изменение/удаление записи из определенной таблицы надо создавать/убивать пользователя...
Но приложение отваливается с ошибкой
ORA-04092 cannot COMMIT in a trigger
...
можноль в триггере сделать какую нибудь изолированную транзакцию?
вот не найду чет где можно глянуть ((( ткните пож пальцем....
9 окт 07, 11:20    [4772290]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
Brodiaga
Member

Откуда:
Сообщений: 501
Автономные транзакции
9 окт 07, 11:23    [4772303]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
Vladimirgs
Member

Откуда: Казань
Сообщений: 694
создаете процедурку с автономной транзакцией внутри, которая произведет фиксацию попыток или действий и вызываете в своем триггере
9 окт 07, 11:24    [4772312]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
1. Зачем создавать пользователя в триггере? Попахивает кривым дизайном...
2. При необходимости в триггере действительно можно объявить автономную транзакцию, но пользоваться этим надо осторожно, ибо чревато...
9 окт 07, 11:24    [4772313]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116156
ananax
День добрый!
Подскажите, как можно создать пользователя в базе из триггера не выполняя коммита?
что делаю:
На добавление/изменение/удаление записи из определенной таблицы надо создавать/убивать пользователя...
Но приложение отваливается с ошибкой
ORA-04092 cannot COMMIT in a trigger
...
можноль в триггере сделать какую нибудь изолированную транзакцию?
вот не найду чет где можно глянуть ((( ткните пож пальцем....


ИМХО

Очень плохая идея вообще.
Создавать и удалять пользователей "на лету" - экзотика.
Или может это у Вас специальное приложение по ведению пользователей ?
Тогда не нужно полагаться на триггер, а выполнять DDL непосредственно в теле
процедуры ...

Идея использовать автономную транзакцию очень плохая в частности.
Вы удалите пользователя, а затем основная транзакция откатится...
Вы создадите пользователя, а затем основная транзакция откатися ...
9 окт 07, 11:25    [4772324]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
Vladimirgs
Member

Откуда: Казань
Сообщений: 694
гы... я больше не буду отвечать :-)
ваще tru55 прав, регистрация событий должна вызываеться в процедурах :-)
9 окт 07, 11:25    [4772328]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
ananax
Member

Откуда: MO
Сообщений: 424
dmidek
ananax
День добрый!
Подскажите, как можно создать пользователя в базе из триггера не выполняя коммита?
что делаю:
На добавление/изменение/удаление записи из определенной таблицы надо создавать/убивать пользователя...
Но приложение отваливается с ошибкой
ORA-04092 cannot COMMIT in a trigger
...
можноль в триггере сделать какую нибудь изолированную транзакцию?
вот не найду чет где можно глянуть ((( ткните пож пальцем....


ИМХО

Очень плохая идея вообще.
Создавать и удалять пользователей "на лету" - экзотика.
Или может это у Вас специальное приложение по ведению пользователей ?
Тогда не нужно полагаться на триггер, а выполнять DDL непосредственно в теле
процедуры ...

Идея использовать автономную транзакцию очень плохая в частности.
Вы удалите пользователя, а затем основная транзакция откатится...
Вы создадите пользователя, а затем основная транзакция откатися ...

Тоесть переносить все в клиентское приложение? Так будет правильней?
9 окт 07, 12:11    [4772731]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
Vladimirgs
Member

Откуда: Казань
Сообщений: 694
ну вообще незнаю как вы пишите прикладу :-)
по сути на экшен батона "Удалить" подвешивает вызов процедуры типа PROC_DEL_USR c входным параметром скажем SUSER

а уже в процедуре городи что тебе надо.

Можно организовать вообще универсальный механизм логирования действий в вашей системе
например завести некую таблицу логов
а все клиентские процедуры обложить вызовом процедур логирования которые будут автономыми транзакциями наполнять логи нужными событиями
Причем это можно сделать управляемым. Т.е. сделать еще и настроечную табличку, в которой размещать данные "Надо/ненадо логировать это действие" типа 0,1.

если ж вся логика в коде приклады - то значитв прикладу...
9 окт 07, 12:21    [4772807]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116156
ananax

Тоесть переносить все в клиентское приложение? Так будет правильней?


Пока мне еще вообще непонятна необходимость ведения пользователей на лету.

Но если это , как я предположил, приложение по ведению пользователей,
то отвечу осторожнее "Делать это в одной транзакции". Поскольку триггер
этого не позволяет, то ...
9 окт 07, 12:22    [4772817]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
ananax
Member

Откуда: MO
Сообщений: 424
Vladimirgs
ну вообще незнаю как вы пишите прикладу :-)
по сути на экшен батона "Удалить" подвешивает вызов процедуры типа PROC_DEL_USR c входным параметром скажем SUSER

а уже в процедуре городи что тебе надо.

Можно организовать вообще универсальный механизм логирования действий в вашей системе
например завести некую таблицу логов
а все клиентские процедуры обложить вызовом процедур логирования которые будут автономыми транзакциями наполнять логи нужными событиями
Причем это можно сделать управляемым. Т.е. сделать еще и настроечную табличку, в которой размещать данные "Надо/ненадо логировать это действие" типа 0,1.

если ж вся логика в коде приклады - то значитв прикладу...

Вообще то, ситуация следующая... изменяется механизм входа в клиентское приложение... раньше аутентификация осуществлялась этим приложением, щас же юзеры хранятся в БД.. тк доступ к базе нужен из других программ, логику аутентификации нашей к которым не прикрутить...
Вот и встает вопрос о поддержании списка пользователей из старой программульки...
9 окт 07, 12:27    [4772872]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
dmidek
ananax

Тоесть переносить все в клиентское приложение? Так будет правильней?


Пока мне еще вообще непонятна необходимость ведения пользователей на лету.

Но если это , как я предположил, приложение по ведению пользователей,
то отвечу осторожнее "Делать это в одной транзакции". Поскольку триггер
этого не позволяет, то ...

Зато решение а-ля авторского хотелова решает главную задачу -
в результате появляются оне же (задачи), но более новые и числом поболее
Например, контроль за шлейфом узеров, созданных откаченными транзакциями
,причем по ходу - не забыть отличать их от еще незакоммиченных..
9 окт 07, 14:02    [4773616]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
Worst_Admin
Member

Откуда: Uzbekistan
Сообщений: 197
ИМХО в триггере нельзя использовать DDL операторы. Зачем не пользуешься хранимки? или религия не позволяет?

with best wishes OmoN.
9 окт 07, 14:07    [4773674]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
Worst_Admin
ИМХО в триггере нельзя использовать DDL операторы. Зачем не пользуешься хранимки? или религия не позволяет?

with best wishes OmoN.


В хранимых процедурах тоже нельзя напрямую использовать DDL
9 окт 07, 14:09    [4773686]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
Vladimirgs
Member

Откуда: Казань
Сообщений: 694
хорошо, теперь давайте зная задачу, что есть за таблица на котору вы хотите повесить какой то тригер с автономной транзакцией на удаление?

Я так понимаю, пользователей вы заведете в оракле. Кроме того у вас есть некий usrlist в котором вы выставляете соответствие оркаловому логину и типа ФИО должность... так чтоль?

Соотвественно уж не знаю как вам там ставят задачу - но помоему уже никак нельзя удалять пользователей, только добавлять.. иначе как ж это все работать то будет - те же логи например...
Если грохнуть запись из пользовтелей - что делать с остальными записями других таблиц???
9 окт 07, 15:04    [4774166]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
ananax
Member

Откуда: MO
Сообщений: 424
Vladimirgs
хорошо, теперь давайте зная задачу, что есть за таблица на котору вы хотите повесить какой то тригер с автономной транзакцией на удаление?

Я так понимаю, пользователей вы заведете в оракле. Кроме того у вас есть некий usrlist в котором вы выставляете соответствие оркаловому логину и типа ФИО должность... так чтоль?

Соотвественно уж не знаю как вам там ставят задачу - но помоему уже никак нельзя удалять пользователей, только добавлять.. иначе как ж это все работать то будет - те же логи например...
Если грохнуть запись из пользовтелей - что делать с остальными записями других таблиц???

В общем целом, пользователь еще должен удаляться при изменении фамилии пользователя ))) Вот не надо тут пинать ))) пользователя из клиентского приложения действительно удалить не так то просто.. тк за ним документы числятся и тд.. но Его легко переименовывают под новго человека, который пришел ))) вот в этот момент старый логин к базе надо бы грохнуть...
9 окт 07, 15:34    [4774492]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
ananax
Member

Откуда: MO
Сообщений: 424
Vladimirgs

Я так понимаю, пользователей вы заведете в оракле. Кроме того у вас есть некий usrlist в котором вы выставляете соответствие оркаловому логину и типа ФИО должность... так чтоль?

Наоборот... была таблица пользователей... теперь по ней прохожусь и создаю пользователей в системе.. где логин - это фамилия_ИД...
Соответственно, при изменении фамилии, надо старого замочить, нового создать...
9 окт 07, 15:39    [4774545]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
Vladimirgs
Member

Откуда: Казань
Сообщений: 694
В конец меня запутали...

Стесняюсь спросить на какое событие в оракле вы хотели вешать СВОЙ тригер на удаление, если заводите "оракловых" юзеров???

Во вторых если у вас политика заводит логин персональный - а не должностной - то при увольнении надо просто блокировать аккаунт, но никак уж не удалять... как вариант делать это следующим образом - при увольнении пользователя убирать связку учетки Оракла и идентификатора в системе...На он логон повесть тригерр проверяющий заход пользоваеля: если в таблице USRLIST "Пользователи" не содержится учетки с котрой происходит вход - то выдавать диагностику... как то так...
9 окт 07, 16:02    [4774749]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
ananax
Member

Откуда: MO
Сообщений: 424
Vladimirgs
В конец меня запутали...

Стесняюсь спросить на какое событие в оракле вы хотели вешать СВОЙ тригер на удаление, если заводите "оракловых" юзеров???

Во вторых если у вас политика заводит логин персональный - а не должностной - то при увольнении надо просто блокировать аккаунт, но никак уж не удалять... как вариант делать это следующим образом - при увольнении пользователя убирать связку учетки Оракла и идентификатора в системе...На он логон повесть тригерр проверяющий заход пользоваеля: если в таблице USRLIST "Пользователи" не содержится учетки с котрой происходит вход - то выдавать диагностику... как то так...

да уже сам запутался...
триггер на инсерт, апдейт и делит на таблицу, где хранится учетная информация. Инфа туда попадает из клиентского приложения.. вот и надо при манипуляциях из клиентской проги создавать и удалять (но лочить думаю будет лучше..) юзеров самой базы...
Проверять при коннекте к базе из триггера есть ли входящий в этой табличке - думаю не совсем то, что мне надо...
Так и плаваю с выбором: что делать та? из клиента добавлять и удалять пользователя или из триггера???
9 окт 07, 16:13    [4774841]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Не могу сказать, что смысл полностью стал понятен, но по озвученному:
ИМХО триггер или код в принципе не так важно(можно и в триггере), а создавать/удалять пользователя с помощью dbms_job, дабы не прерывать транзакцию.
Минус очевидный - небольшое запаздывание в управлении учетными записями, но он не такой критичный.
9 окт 07, 16:24    [4774927]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
ananax
Member

Откуда: MO
Сообщений: 424
Jannny
Не могу сказать, что смысл полностью стал понятен, но по озвученному:
ИМХО триггер или код в принципе не так важно(можно и в триггере), а создавать/удалять пользователя с помощью dbms_job, дабы не прерывать транзакцию.
Минус очевидный - небольшое запаздывание в управлении учетными записями, но он не такой критичный.

Типа.. запись помечена на удаление.. и ночью так или каждый час в джобе рубить.. правильно понял?
9 окт 07, 16:45    [4775119]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
ananax
Jannny
Не могу сказать, что смысл полностью стал понятен, но по озвученному:
ИМХО триггер или код в принципе не так важно(можно и в триггере), а создавать/удалять пользователя с помощью dbms_job, дабы не прерывать транзакцию.
Минус очевидный - небольшое запаздывание в управлении учетными записями, но он не такой критичный.
Типа.. запись помечена на удаление.. и ночью так или каждый час в джобе рубить.. правильно понял?
Не совсем, зачем ночью? Просто ставите джоб с созданием/удалением на sysdate, например, в Вашем триггере. При коммите (общем коммите всей транзакции) джоб почти сразу начнет выполняться.
На всякий случай - плюс в том, что при откате Вашей транзакции, она откатится целиком, чего не будет, если выполнять без джоба.
ЗЫ: надеюсь, что это не ежесекундная операция?
9 окт 07, 16:53    [4775199]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
ananax
Member

Откуда: MO
Сообщений: 424
Jannny
ananax
Jannny
Не могу сказать, что смысл полностью стал понятен, но по озвученному:
ИМХО триггер или код в принципе не так важно(можно и в триггере), а создавать/удалять пользователя с помощью dbms_job, дабы не прерывать транзакцию.
Минус очевидный - небольшое запаздывание в управлении учетными записями, но он не такой критичный.
Типа.. запись помечена на удаление.. и ночью так или каждый час в джобе рубить.. правильно понял?
Не совсем, зачем ночью? Просто ставите джоб с созданием/удалением на sysdate, например, в Вашем триггере. При коммите (общем коммите всей транзакции) джоб почти сразу начнет выполняться.
На всякий случай - плюс в том, что при откате Вашей транзакции, она откатится целиком, чего не будет, если выполнять без джоба.
ЗЫ: надеюсь, что это не ежесекундная операция?

а... догнал...
те и сам джоб создаем в триггере... так?
9 окт 07, 17:05    [4775316]     Ответить | Цитировать Сообщить модератору
 Re: DDL в триггере  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
ananax
те и сам джоб создаем в триггере... так?
угу
9 окт 07, 17:12    [4775370]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить