Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 6 7 8 9 10 [11] 12 13 14 15 .. 24   вперед  Ctrl
 Re: Покритикуйте Оракл 10г  [new]
drev
Member

Откуда: Одесса - Берег Красного Дерева - Красный мир
Сообщений: 564
Gluk (Kazan)
drev
Gluk (Kazan)
P.S. я же не сервер


И это хорошо:) иначе бы он глючил:) или глюкал:)


давайте НЕ БУДЕМ переходить к обсуждению НИКОВ ???


мне показалось, что шутка безобидная.. если не так - извините
18 июл 07, 18:23    [4406169]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
MGR
Member

Откуда:
Сообщений: 536
softwarer

Признаться, не думаю, что Игорь набивал такую кучу кода вместо того, чтобы сказать несколько слов. Полагаю, он как раз вырезал кусок кода, который был под рукой - иначе не беспокоился бы.


На самом деле это может быть лишь куском кода. Дальше может быть сложная проверка, которая проверяет лимит за период. Учитывает оплату и т.п.
18 июл 07, 18:24    [4406180]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
drev
Member

Откуда: Одесса - Берег Красного Дерева - Красный мир
Сообщений: 564
softwarer
drev
2. Любая нотификация, типа effective immediately новые цены на следующие товары установлены следующим образом

Нуждается в сравнении old с new дабы проверить, что цены действительно изменились. Цитата-цитатой, но не проходит :(

почему?? зачем проверка? например, в табличке два поля item_id, price

drev
хоть мылом, хоть прямо в кассовые аппараты,

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

цифра 2 в начале ответа означала, что это новый пример.. к первому примеру с роллбэцк не имеюсщего отношения.





3. изменяются поля А и Б , устанавливаем С = f(А, Б)

Достаточно?
18 июл 07, 18:33    [4406221]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
drev
Member

Откуда: Одесса - Берег Красного Дерева - Красный мир
Сообщений: 564
Извините, я возьму переыв, у нас полвосьмого утра
18 июл 07, 18:39    [4406247]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67469
Блог
drev
почему?? зачем проверка?

Несерьезно, простите.

drev
например, в табличке два поля item_id, price

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

update items set price = 100 where substr (item_id, 10, 2) = '23'

drev
цифра 2 в начале ответа означала, что это новый пример.. к первому примеру с роллбэцк не имеюсщего отношения.

Я и отвечаю для нового примера. Подумайте над ответом с этой точки зрения. Транзакция, знаете ли, далеко не всегда состоит из одного оператора, и триггер не имеет права надеяться, что вся транзакция целиком успешно завершится.

drev
3. изменяются поля А и Б , устанавливаем С = f(А, Б)

Для этого вроде как предусмотрены calculated fields, разве нет?

Ладно, допустим, делаем в триггере. Как будет написан этот триггер? Правильно, (:old.A <> :new.A or :old.B <> :new.B), иначе опять же сделаем лишнюю работу (полезем менять данные сами на себя)

drev
Достаточно?

Для убеждения в частой необходимости - совершенно недостаточно.
18 июл 07, 18:58    [4406307]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
drev
Member

Откуда: Одесса - Берег Красного Дерева - Красный мир
Сообщений: 564
Реализация правил целостности данных
Целостность, непротиворечивость и достоверность информации в таблицах с рекурсивными связями обеспечиваются выполнением ряда правил:

Каждый сотрудник имеет только одного руководителя.
Каждый сотрудник не является сам себе руководителем.
Каждый руководитель в первую очередь сотрудник.
Имеется только один сотрудник (директор организации), который никому не подчиняется.
Правило 2 необходимо усилить. Каждый сотрудник не должен находиться в роли собственного руководителя не только непосредственно, но и опосредствованно, через других сотрудников.
Выполнение правила 1 обеспечивается ограничением первичного ключа и не требует дополнительных SQL-операторов.

Рассмотрим правило 2. Имена сотрудника и его начальника в одной записи не должны совпадать. При добавлении и изменении записи в таблице emp_mgr это требование предъявляется к новой записи, которая до подтверждения транзакции располагается во временной таблице с именем inserted. Этому правилу соответствуют следующие SQL-операторы:

IF EXISTS (SELECT * FROM inserted 
           WHERE mgr=emp)
BEGIN
  ROLLBACK TRAN
  RAISERROR('САМ СЕБЕ НАЧАЛЬНИК',16,10)
  RETURN
END

Правило 3 говорит о том, что именем начальника может быть только уже внесенное в таблицу имя сотрудника. Это требование представляет собой декларативную ссылочную целостность и обеспечивается ограничением внешнего ключа. Однако, чтобы запустить механизм триггеров, придется удалить ограничение внешнего ключа и его функцию возложить на триггер.

В новой или измененной записи имя начальника должно быть указано и уже присутствовать в таблице в качестве имени сотрудника, что может быть записано следующими SQL-операторами:

IF EXISTS(SELECT * FROM inserted
    WHERE mgr IS NOT NULL) AND
    NOT EXISTS(SELECT * FROM inserted,emp_mgr
    WHERE emp_mgr.emp=inserted.mgr)
BEGIN
  RAISERROR('НЕТ НАЧАЛЬНИКА',16,10)
  ROLLBACK TRAN
  RETURN
END

или (что эквивалентно)

IF NOT EXISTS(SELECT * FROM emp_mgr, inserted
    WHERE emp_mgr.emp=inserted.mgr
    OR inserted.mgr IS NULL)
BEGIN
  RAISERROR('НЕТ НАЧАЛЬНИКА',16,10)
  ROLLBACK TRAN
  RETURN
END

В соответствии с правилом 4 необходимо проверить, введена ли запись о директоре (сотруднике, у которого нет начальника). Если такая запись уже есть, ввод нового директора запрещается с помощью следующих SQL-операторов:

IF EXISTS (SELECT * FROM inserted 
           WHERE mgr IS NULL)
    AND EXISTS 
       (SELECT * FROM emp_mgr,inserted
    WHERE emp_mgr.mgr IS NULL
    AND emp_mgr.emp<>inserted.emp)
BEGIN
  ROLLBACK TRAN
  RAISERROR('ОДИН ДИРЕКТОР УЖЕ ЕСТЬ',16,10)
  RETURN
END
19 июл 07, 00:10    [4406890]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
drev
Member

Откуда: Одесса - Берег Красного Дерева - Красный мир
Сообщений: 564
Create trigger [t1] on [dbo].[DB] for Update, insert as

Update Table1 set field01 = ...
                  field02 = ...
                  ...
                  fieldn = ...
where god = (select god from inserted) and mes = (select mes from inserted)
19 июл 07, 00:13    [4406891]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
drev
Member

Откуда: Одесса - Берег Красного Дерева - Красный мир
Сообщений: 564
Во вторичных базах данных есть триггер в справочнике городов на обновление: 
update MainDatabase..Table1 
set name = (select inserted.name from inserted 
where MainDatabase..Table1.id = inserted.id) 
where MainDatabase..Table1.id in (select id from inserted); 
19 июл 07, 00:21    [4406894]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
drev
Member

Откуда: Одесса - Берег Красного Дерева - Красный мир
Сообщений: 564
CREATE TRIGGER ComplectInformator

ON Complect

FOR INSERT, UPDATE, DELETE

as

insert ComplectInfo(UDN, sum_s)

select distinct inserted.UDN, 0 from inserted

where not exists (

select inserted.UDN

from ComplectInfo where ComplectInfo.UDN=inserted.UDN)

 

update ComplectInfo

set ComplectInfo.sum_s=ComplectInfo.sum_s+(

select sum(inserted.s) from inserted

where inserted.UDN=ComplectInfo.UDN)

where exists (

select distinct ComplectInfo.UDN

from inserted where ComplectInfo.UDN=inserted.UDN)

 

update ComplectInfo

set ComplectInfo.sum_s=ComplectInfo.sum_s-

(select sum(deleted.s) from deleted where deleted.UDN=ComplectInfo.UDN)

where exists( 

select distinct ComplectInfo.UDN from deleted

where deleted.UDN=ComplectInfo.UDN)

GO
19 июл 07, 00:26    [4406902]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
drev
Member

Откуда: Одесса - Берег Красного Дерева - Красный мир
Сообщений: 564
Количество записей таблицы inserted, успешно соединяемых с записями таблицы первичного ключа, не совпадает с общим количеством вставленных или удаленных записей; по крайней мере одна запись неверна. Следующий фрагмент программы демонстрирует методику проверки ссылочной целостности в триггере: 

CREATE TRIGGER tr1
ON...
FOR INSERT, UPDATE
AS
DECLARE @ROWS INT
SELECT @rows = @@rowcount
...
IF (SELECT COUNT(*) FROM inserted i, pkey_tab p
WHERE i.fkey = p.pkey) != @rows
/* По крайней мере одна из вставленных/удаляемых записей
** не совпадает с первичным ключом */
/* Начать обработку ошибок */
19 июл 07, 00:34    [4406904]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
ChA
Member

Откуда: Москва
Сообщений: 11381
Шо это было ? Картинка с другого сайта.
Если код для MSSQL, то вызывает удручающее впечатление, IMHO.
19 июл 07, 00:39    [4406906]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
drev
Member

Откуда: Одесса - Берег Красного Дерева - Красный мир
Сообщений: 564
softwarer
..



Вышеприведённые примеры взяты с первой половины первой страницы яндекса при запросе !(update from inserted)

Достаточно?:)

Кстати, join inserted, deleted из той же выборки встретился 1 раз.
19 июл 07, 00:45    [4406909]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
drev
Member

Откуда: Одесса - Берег Красного Дерева - Красный мир
Сообщений: 564
ChA
Шо это было ? Картинка с другого сайта.
Если код для MSSQL, то вызывает удручающее впечатление, IMHO.


ну да:) где уж им уж произвести:) первый пример - Intuit, последний - из сертификационного экзамена:)
19 июл 07, 00:50    [4406913]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
ChA
Member

Откуда: Москва
Сообщений: 11381
drev
первый пример - Intuit, последний - из сертификационного экзамена:)
Вспомнилось классика, "кто не умеет делать - учит других"...
19 июл 07, 01:07    [4406930]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
drev
Member

Откуда: Одесса - Берег Красного Дерева - Красный мир
Сообщений: 564
ChA
drev
первый пример - Intuit, последний - из сертификационного экзамена:)
Вспомнилось классика, "кто не умеет делать - учит других"...


Смотрите, я их не писал, я приводил пример частоты использования функционала.:)

Просто интересно, что так не понравилось?
19 июл 07, 01:13    [4406934]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
ChA
Member

Откуда: Москва
Сообщений: 11381
drev
Смотрите, я их не писал, я приводил пример частоты использования функционала.:)

Просто интересно, что так не понравилось?
Да я понял. Просто оторопел от конструкций, многое можно было бы выразить проще, изящнее и оптимальнее, но это уже офтоп даже для офтопа, не вижу смысла здесь его продолжать. Здесь и так его с избытком.
19 июл 07, 01:24    [4406939]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
Jebrail
Member

Откуда: Тбилиси
Сообщений: 348
Геннадий Евтушенко

гониш.

если при работе с ораклом фигово писать, получится фиговее чем написал :D
19 июл 07, 02:14    [4406964]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
drev
Gluk (Kazan)
drev
Gluk (Kazan)
P.S. я же не сервер


И это хорошо:) иначе бы он глючил:) или глюкал:)


давайте НЕ БУДЕМ переходить к обсуждению НИКОВ ???


мне показалось, что шутка безобидная.. если не так - извините


проехали

P.S. Вы понятия не имеете за ЧТО я заработал эту кличку
19 июл 07, 09:22    [4407331]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67469
Блог
drev
Смотрите, я их не писал, я приводил пример частоты использования функционала.:)

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

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

Скажем, первое же, из того что Вы привели:

IF EXISTS (SELECT * FROM inserted 
           WHERE mgr=emp)
BEGIN
  ROLLBACK TRAN
  RAISERROR('САМ СЕБЕ НАЧАЛЬНИК',16,10)
  RETURN
END

Уж простите, но только идиот будет делать это триггером. Это самый что ни на есть обычный check constraint.

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

Собственно, получается довольно забавная логическая цепочка. Напомню, я говорил - "странное и сомнительное решение было выделить inserted и deleted без updated". Сейчас оказывается, что в результате получилась прорва идиотского кода. Имхо это подтверждает предположение о сомнительности решения.

В общем, пока что Вы успешно подтверждаете практическое отсутствие внятных задач для "new без old". Почти сто процентов примеров - кривой код, нуждающийся в улучшении.

P.S. К сожалению, не удалось вечером ответить по поводу парсеров, постараюсь выкроить время в течение дня.
19 июл 07, 12:31    [4408883]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034

softwarer wrote:
> Частота неправильного использования функционала - уж простите, не
> критерий. Если люди неправильно работают - это не значит, что инструмент
> должен делать неправильную работу более удобной; это значит, что
> инструмент недостаточно стимулирует правильную.
Вы знаете... В последнее время приходится перекапывать очень много
ораклового кода... Дык - люди в 90% случаев - неправильно и
"неправомерно" использую коллекции, rowtype, исключения...
т.е. там, где нормальный чел сделает обычный dml - эти перцы
наворачивают ТАКОЕ, что глаза на лоб лезут.

> Уж простите, но только идиот будет делать это триггером. Это самый что
> ни на есть обычный check constraint.
в данном случае - да. можно, правда, тут же придумать другой случай с
тем же примерно функционалом - но не попадающий в разряд check
constraint (который я, правда - всё равно смогу туда загнать ;) ).

Posted via ActualForum NNTP Server 1.4

19 июл 07, 12:39    [4408954]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
locky

Дык - люди в 90% случаев - неправильно и
"неправомерно" использую коллекции, rowtype, исключения...


Гмм, ну коллекции ладно ... исключения тоже, допустим
но КАК можно неправомерно использовать rowtype ???

Ей богу, это выше моего понимания !!!
Не соблаговолите примерчик ?
19 июл 07, 12:51    [4409055]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034

Gluk (Kazan) wrote:
> Гмм, ну коллекции ладно ... исключения тоже, допустим
> но КАК можно неправомерно использовать rowtype ???
>
> Ей богу, это выше моего понимания !!!
> Не соблаговолите примерчик ?
Когда есть табла из 50+ полей, из ней надо выбрать, скажем ID,
пробежатцо по списку и чегой-то вызвать....
Вооот... и вместо
  i integer;

люди пишут
  i MYWIDETABLE%rowtype;
потом это всё растекается по коду, передается/получается и т.п.
я, честно говоря, не шибко знаю как работает оптимизатор оракла, но
что-то мне подсказывает - второй вариант хуже первого.

Posted via ActualForum NNTP Server 1.4

19 июл 07, 13:00    [4409141]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
locky

  i MYWIDETABLE%rowtype;
потом это всё растекается по коду, передается/получается и т.п.
я, честно говоря, не шибко знаю как работает оптимизатор оракла, но
что-то мне подсказывает - второй вариант хуже первого.


Неправильно вам это что то подсказывает. Во первых вариант НИЧЕМ не хуже, во вторых это РЕКОМЕНДУЕМАЯ практика (правда я обычно использую %type, но это дело вкуса), которая ГАРАНТИРУЕТ, что переменные скрипта совпадают по типу с соответствующими столбцами таблицы и уберегает тем самым от многих неприятностей при alter этих таблиц.
Уверен, что в случае с исключениями (а возможно и с коллекциями) что-то тоже подсказало вам НЕ СОВСЕМ правильно.
19 июл 07, 13:19    [4409304]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
Да, если речь о курсоре то я ОБЫЧНО использую rowtype
И предвидя дольнейшие высказывания, в Oracle курсоры не просаживают производительность как в MS SQL :)
19 июл 07, 13:22    [4409326]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
Gluk (Kazan)
locky

  i MYWIDETABLE%rowtype;
потом это всё растекается по коду, передается/получается и т.п.
я, честно говоря, не шибко знаю как работает оптимизатор оракла, но
что-то мне подсказывает - второй вариант хуже первого.


Неправильно вам это что то подсказывает. Во первых вариант НИЧЕМ не хуже, во вторых это РЕКОМЕНДУЕМАЯ практика (правда я обычно использую %type, но это дело вкуса),


Ну в данном случае вместо обявления числовой переменной объявляется запись. Естественно, использование table.Name%type - рекомендумое и оправданное, а вот использовать запись это наверное действительно излишне.
19 июл 07, 13:57    [4409680]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 6 7 8 9 10 [11] 12 13 14 15 .. 24   вперед  Ctrl
Все форумы / Сравнение СУБД Ответить