Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
Glory
Member

Откуда:
Сообщений: 104760
MorAdan

Мдя.... И смысл такой операции? При такой операции если учитывать булевую логику ни одной строки не будет затронуто, так как 2*2=5->4=5--> False. Условие не выполненно. Такую конструкцию оптимизатор выкидываем еще на стадии анализа запроса.


0 rows updated in 0 seconds.
Return All Rows

Логический смысл команды определяет тот, кто ее составил, а не сервер. Может у клиента проблемы с арифетикой. И MSSQL также не будет ничего обновлять. Но триггер сработает. Потому что это его задача - срабатывать при возникновении события
30 окт 09, 13:04    [7861706]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
то MorAdan

ИМХО из этого
MorAdan
...Работали в основном с Oracle,DB2.
Условия заказчика сделатьь на MsSQL.
... нету времени листать BOL и разбираться в тонкостях.
вот этого
MorAdan
Дело в том что в MsSQL будет немного данных и операций которые необходмы для связки с длругим приложением. А 95% системы будет функионировать на Оракле. Данные будут подтягиватся через гетерогенное соединение.
Но вот ту меленькую часть надо сделать.
и дальнейшего обсуждения, проще (и сильно подозреваю, что и качественнее) нанять сиквельника (хоть и по временному контракту).
30 окт 09, 13:12    [7861791]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
MorAdan
Member

Откуда: Киев
Сообщений: 272
Гавриленко Сергей Алексеевич
Вы пришли сравнением Оракла и MS SQL заниматься? Тогда вы форумом ошиблись.


Я не пытаюсь сравнивать. Я пытаюсь понять как работает данная БД в отличие от других для выполнения поставленной задачи. В теме написал помогите , а не ругайте. Каждая база разная и работает по своему. И в MsSQL есть свои преимущеуства TSQL перед PlSQl. Просто нужно понять как некоторые вещи можно перенести из привычной БД в требуемую на данный момент.
30 окт 09, 13:19    [7861846]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
MorAdan
Гавриленко Сергей Алексеевич
Вы пришли сравнением Оракла и MS SQL заниматься? Тогда вы форумом ошиблись.


Я не пытаюсь сравнивать. Я пытаюсь понять как работает данная БД в отличие от других для выполнения поставленной задачи. В теме написал помогите , а не ругайте. Каждая база разная и работает по своему. И в MsSQL есть свои преимущеуства TSQL перед PlSQl. Просто нужно понять как некоторые вещи можно перенести из привычной БД в требуемую на данный момент.
Мне кажется, все нюансы здесь разжевали по нескольку раз.
Я думал, человек, "поварившийся" в Oracle, начинает всё "схватывать налету"...

Кстати, почему-то не затрагивалась тема триггеров BEFORE и INSTEAD OF
30 окт 09, 13:27    [7861943]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
MorAdan
Member

Откуда: Киев
Сообщений: 272
iap
MorAdan
Гавриленко Сергей Алексеевич
Вы пришли сравнением Оракла и MS SQL заниматься? Тогда вы форумом ошиблись.


Я не пытаюсь сравнивать. Я пытаюсь понять как работает данная БД в отличие от других для выполнения поставленной задачи. В теме написал помогите , а не ругайте. Каждая база разная и работает по своему. И в MsSQL есть свои преимущеуства TSQL перед PlSQl. Просто нужно понять как некоторые вещи можно перенести из привычной БД в требуемую на данный момент.
Мне кажется, все нюансы здесь разжевали по нескольку раз.
Я думал, человек, "поварившийся" в Oracle, начинает всё "схватывать налету"...

Кстати, почему-то не затрагивалась тема триггеров BEFORE и INSTEAD OF


Стараемся схавтывать. Основные вопросы понятно и уже сделали часть раелизации которая была необходима на сейчас.
Before и Instead Of пока не нужно.

Все говорят что курсоры лучше не оспользывать? Они тормознутые на MsSQL?
30 окт 09, 13:33    [7862022]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
Glory
Member

Откуда:
Сообщений: 104760
MorAdan


Все говорят что курсоры лучше не оспользывать? Они тормознутые на MsSQL?

Они не тормознутые. Просто некоторые программисты все наровят сделать через курсоры. Потому что не знают других способов получения нужного результата
30 окт 09, 13:35    [7862050]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
aleks2
Guest
iap
Я думал, человек, "поварившийся" в Oracle, начинает всё "схватывать налету"...


Это надо повариться в двух котлах, как минимум, опосля чего начинаешь осознавать, что все - один хрен... только называется по-разному.
30 окт 09, 13:36    [7862052]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
MorAdan
Member

Откуда: Киев
Сообщений: 272
aleks2
iap
Я думал, человек, "поварившийся" в Oracle, начинает всё "схватывать налету"...


Это надо повариться в двух котлах, как минимум, опосля чего начинаешь осознавать, что все - один хрен... только называется по-разному.

:-)
30 окт 09, 13:36    [7862065]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
MorAdan
Все говорят что курсоры лучше не оспользывать? Они тормознутые на MsSQL?
По сравнению с массовой обработкой данных, они, как мне кажется, везде будут "тормознутые".
За редкими исключениями. Которые, однако, неоднократно встречались мне на практике.
Не стоит что-либо воспринимать как догму.
30 окт 09, 13:38    [7862091]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
MorAdan
Member

Откуда: Киев
Сообщений: 272
iap
MorAdan
Все говорят что курсоры лучше не оспользывать? Они тормознутые на MsSQL?
По сравнению с массовой обработкой данных, они, как мне кажется, везде будут "тормознутые".
За редкими исключениями. Которые, однако, неоднократно встречались мне на практике.
Не стоит что-либо воспринимать как догму.



Последний вопрос до конца не расскрытый.

CREATE TRIGGER [dbo].[TRG_App_Modules_Rights] ON [dbo].[App_Modules_Rights]
WITH EXECUTE AS CALLER
FOR INSERT
AS
BEGIN
insert into App_Users_Rights ( Id_User,Id_Module,Id_Right,Is_Active) 
select ur.Id_User, i.id_module, i.id_right, 0
from inserted i
	cross join Users_Rights ur
end;
С этим все понятно. Работает нареканий нет.
Но вот если в цикле нужно сделать много разных операций. Как быть ?
For rec in (select cust.Id_Customer,dep.Id_Department from Customer cust,Departmants dep
                   where cust.Id_Department=dep.Id_Department(+)
                            and cust.Is_Active=1
                            and Cust.City_Code in (3034,5678))
  Loop
   --Что то делаем внутри цикла
   -- Много разных операций и внутренных подциклов
  end Loop;
Как лучше это сделать на MsSQL? Не важно или это тригерр или вызываемая процедура или джоб.
30 окт 09, 13:44    [7862144]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
Glory
Member

Откуда:
Сообщений: 104760
MorAdan
[
Но вот если в цикле нужно сделать много разных операций. Как быть ?

Что такое "разные операции" ? Сложить/умножить ?
30 окт 09, 13:46    [7862161]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
MorAdan
Member

Откуда: Киев
Сообщений: 272
Glory
MorAdan
[
Но вот если в цикле нужно сделать много разных операций. Как быть ?

Что такое "разные операции" ? Сложить/умножить ?


И сложить и поделить, вызов функций на основание проверок, всатвка, апдейт ....
30 окт 09, 13:46    [7862168]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
MorAdan
С этим все понятно. Работает нареканий нет.
Но вот если в цикле нужно сделать много разных операций. Как быть ?
For rec in (select cust.Id_Customer,dep.Id_Department from Customer cust,Departmants dep
                   where cust.Id_Department=dep.Id_Department(+)
                            and cust.Is_Active=1
                            and Cust.City_Code in (3034,5678))
  Loop
   --Что то делаем внутри цикла
   -- Много разных операций и внутренных подциклов
  end Loop;
Как лучше это сделать на MsSQL? Не важно или это тригерр или вызываемая процедура или джоб.
Если сильно прижмёт, то - цикл WHILE по курсору с проверкой @@FETCH_STATUS
30 окт 09, 13:48    [7862185]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31163
MorAdan
Мдя.... И смысл такой операции? При такой операции если учитывать булевую логику ни одной строки не будет затронуто, так как 2*2=5->4=5--> False. Условие не выполненно. Такую конструкцию оптимизатор выкидываем еще на стадии анализа запроса.
Триггер - это хранимая процедура, которая вызывается при выполнении сервером соответствующей команды, а не обработчик изменений в данных. Воспринимайте его именно так.

Почему принята именно такая идеология - можно обратиться к авторам, в компанию Sybase, но независимо от причин, никаких неудобств это не доставляет.
30 окт 09, 13:48    [7862190]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
MorAdan
И сложить и поделить, вызов функций на основание проверок, всатвка, апдейт ....
Если нет вызовов внешних процедур, то как правило все эти операции можно будет объединить.
30 окт 09, 13:49    [7862205]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
Glory
Member

Откуда:
Сообщений: 104760
MorAdan
Glory
MorAdan
[
Но вот если в цикле нужно сделать много разных операций. Как быть ?

Что такое "разные операции" ? Сложить/умножить ?


И сложить и поделить, вызов функций на основание проверок, всатвка, апдейт ....

И в чем проблема ?
select f1+f2, f3*f4, dbo.myfunc(f5) from inserted
30 окт 09, 13:50    [7862210]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
MorAdan
Member

Откуда: Киев
Сообщений: 272
alexeyvg
MorAdan
Мдя.... И смысл такой операции? При такой операции если учитывать булевую логику ни одной строки не будет затронуто, так как 2*2=5->4=5--> False. Условие не выполненно. Такую конструкцию оптимизатор выкидываем еще на стадии анализа запроса.
Триггер - это хранимая процедура, которая вызывается при выполнении сервером соответствующей команды, а не обработчик изменений в данных. Воспринимайте его именно так.

Почему принята именно такая идеология - можно обратиться к авторам, в компанию Sybase, но независимо от причин, никаких неудобств это не доставляет.


Будем воспринимать.... Спасибо.
Привычка осталась с Oracle,DB2,FireBird....
Там реализованно чуть по другому.
30 окт 09, 13:50    [7862211]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
MorAdan
Member

Откуда: Киев
Сообщений: 272
Glory
MorAdan
Glory
MorAdan
[
Но вот если в цикле нужно сделать много разных операций. Как быть ?

Что такое "разные операции" ? Сложить/умножить ?


И сложить и поделить, вызов функций на основание проверок, всатвка, апдейт ....

И в чем проблема ?
select f1+f2, f3*f4, dbo.myfunc(f5) from inserted


Ну очень часто вызов и операции выполняются с помощью условий. Если условие 1 то выполняется 1 блок процедуры иначе другой и т.д. Потом еще анализ данных. На основание него выборка из таблиц которые определяются на основание предыдущих подсчетов.

  For Rec In (Select r.Id_Shop, r.Logicdate, r.Progressivo, r.Id_Event, Sum(r.Totalevaluta) Sum_Discount, Count(Distinct Rc.Code_Card) Count_Cust,Sum(r.Totalevaluta) /Count(Distinct Rc.Code_Card)
                From Cnq_Receiptsrows r, Cnq_Receiptsrows_Customers Rc
               Where r.Processed = 0
                     And r.Class = 25
                     And r.Id_Shop = Rc.Id_Shop
                     And r.Id_Event = Rc.Id_Event
                     And Rc.Op_Datetime <= Sysdate - 1 / 12
               Group By r.Id_Shop, r.Logicdate, r.Progressivo, r.Id_Event
               Order By Count_Cust)
  Loop
   Select Sum(Rr.Totalevaluta)/Rec.Count_Cust
     Into v_Sum_Cust_Cash
     From [table2] Rr
    Where Rr.Id_Shop = Rec.Id_Shop
          And Rr.Logicdate = Rec.Logicdate
          And Rr.Progressivo = Rec.Progressivo
          And Rr.Id_Event = Rec.Id_Event
          And Rr.Class = 5;
   For Cust In (Select *
                  From Cnq_Receiptsrows_Customers Rc
                 Where Rc.Id_Shop = Rec.Id_Shop
                       And Rc.Id_Event = Rec.Id_Event)
   Loop
    ---
    If v_Previously_Calc = 0 Then
   
     Insert Into 
      (Op_Owner, Op_Type, Id_Shop, Logicdate, Op_Datetime, Code_Card, Type_Card, Main_Frec, Slave_Frec, Total_Frec, Discount_Frec, Discount_Code)
     Values
      (1,
       1,
       Rec.Id_Shop,
       Rec.Logicdate,
       Cust.Op_Datetime,
       Cust.Code_Card,
       Cust.Type_Card,
       Rec.Id_Event,
       Rec.Progressivo,
       v_Sum_Cust_Cash,
       v_Sum_Cust_Disc,
       Cust.Discount_Id);
     --Метим как нормально обработанный чек
     Update Cnq_Receiptsrows_Customers Rcc
        Set Rcc.Processed = 1
      Where Rcc.Id_Shop = Cust.Id_Shop
            And Rcc.Id_Event = Cust.Id_Event
            And Rcc.Code_Card = Cust.Code_Card;
    Else
     --метим как повтор
     Update Cnq_Receiptsrows_Customers Rcc
        Set Rcc.Processed = -1
      Where Rcc.Id_Shop = Cust.Id_Shop
            And Rcc.Id_Event = Cust.Id_Event
            And Rcc.Code_Card = Cust.Code_Card;
    End If;
   End Loop;
   Update Cnq_Receiptsrows Rr
      Set Rr.Processed = 1
    Where Rr.Id_Shop = Rec.Id_Shop
          And Rr.Logicdate = Rec.Logicdate
          And Rr.Progressivo = Rec.Progressivo
          And Rr.Id_Event = Rec.Id_Event
          And Rr.Class In (5, 25);
  End Loop;
30 окт 09, 13:56    [7862278]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
Glory
Member

Откуда:
Сообщений: 104760
MorAdan


Ну очень часто вызов и операции выполняются с помощью условий. Если условие 1 то выполняется 1 блок процедуры иначе другой и т.д. Потом еще анализ данных. На основание него выборка из таблиц которые определяются на основание предыдущих подсчетов.

И что это все значит ? Что теперь все надо делать через циклы ?
30 окт 09, 13:59    [7862309]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
MorAdan
Member

Откуда: Киев
Сообщений: 272
Glory,

Нет не всегда, но иногда нужно....
Если что то используется редко это не повод отказатся от конструкции в целом навсегда.
30 окт 09, 14:01    [7862328]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
Glory
Member

Откуда:
Сообщений: 104760
MorAdan
Glory,

Нет не всегда, но иногда нужно....
Если что то используется редко это не повод отказатся от конструкции в целом навсегда.

Не повод изначально так проектировать
30 окт 09, 14:04    [7862361]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31163
MorAdan
Glory,

Нет не всегда, но иногда нужно....
Если что то используется редко это не повод отказатся от конструкции в целом навсегда.
Да в общем никто и не запрещает использовать циклы по обработке записей.

Просто сначала нужно в любых задачах для СУБД видеть операции над множествами.
30 окт 09, 14:05    [7862365]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
MorAdan
Ну очень часто вызов и операции выполняются с помощью условий. Если условие 1 то выполняется 1 блок процедуры иначе другой и т.д. Потом еще анализ данных. На основание него выборка из таблиц которые определяются на основание предыдущих подсчетов.
Все ваши цыклю здесь несложно свести к двум операциям - INSERT и UPDATE с соответствующими условиями. Да и отработают они, скорее всего, в разы быстрее, чем ваш цикл.
30 окт 09, 14:06    [7862377]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31163
MorAdan
Ну очень часто вызов и операции выполняются с помощью условий. Если условие 1 то выполняется 1 блок процедуры иначе другой и т.д. Потом еще анализ данных. На основание него выборка из таблиц которые определяются на основание предыдущих подсчетов.
В приведённом вами примере всего одно условие.

Этот текст, думаю, можно легко переделать в один инсёрт и один апдэйт.

И насколько легче серверу будет выполнить эти 2 операции, чем выполнять кучу операций в вложенных циклах, насколько легче построить оптимальные планы, распаралелить выполнение, в крнце концов!
30 окт 09, 14:11    [7862426]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по тригеррам и циклам. Помогите Ораклистам.  [new]
MorAdan
Member

Откуда: Киев
Сообщений: 272
alexeyvg
MorAdan
Ну очень часто вызов и операции выполняются с помощью условий. Если условие 1 то выполняется 1 блок процедуры иначе другой и т.д. Потом еще анализ данных. На основание него выборка из таблиц которые определяются на основание предыдущих подсчетов.
В приведённом вами примере всего одно условие.

Этот текст, думаю, можно легко переделать в один инсёрт и один апдэйт.

И насколько легче серверу будет выполнить эти 2 операции, чем выполнять кучу операций в вложенных циклах, насколько легче построить оптимальные планы, распаралелить выполнение, в крнце концов!


В приведенном примере да. Я выбрал самый маленький.
Но есть и другие в которых количетсов опрераций номного болше и структура выбора следующих опрецый развтвелнная, и не ограниченны 2-3 ветками дерева.
30 окт 09, 14:30    [7862590]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить