Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.22;
Скачать: CL | DM;

Вниз

Переход на MS SQL   Найти похожие ветки 

 
Romkin ©   (2002-07-26 14:25) [0]

Возникла тут задумка, перейти с Interbase 6 на MS SQL 2000.
Да только вопросы возникают, будет ли быстрее, да и как перевести.
А конкретно - есть скрипт на IB http://www.romkin.pochtamt.ru/script.htm
Меня интересует, можно ли перевести триггеры у accountbook на MS SQL, и как это выглядит? Кому не трудно, гляньте плиз. Никак не могу разобраться с транзакциями в MS SQL и триггерами


 
Polevi ©   (2002-07-26 14:33) [1]

в IB триггер срабатывает для каждой измененной записи - в MS SQL он срабатывает один раз - старые и новые значения хранятся в таблицах inserted и deleted

вместо for select используй временные таблицы


 
Eduard ©   (2002-07-26 14:36) [2]

Переписывать придется много. В MSSQL нету Domain`ов, а есть Default`ы, а триггер будет выглядеть где-то так:

CREATE TRIGGER ACCOUNTBOOK_CHECK_INSERT ON dbo.ACCOUNTBOOK
FOR INSERT
AS
BEGIN
IF (NEW.COUNTNUM <= 0) THEN
RAISEERROR(...;
IF (NOT NEW.INOUT_SIGN IN (-1,0,1)) THEN
RAISEERROR(..);
END

...ну еще много-много отличий.


 
Eduard ©   (2002-07-26 14:37) [3]

... а, вообще-то, NEW там тоже нету.


 
Romkin ©   (2002-07-26 14:50) [4]

Так весь смысл в том, что триггер должен сработать после вставки записи в базу, в триггерах after у таблицы accountbook проверяется остатки товара, критерий - если в какой-то момент времени остаток отрицательный - выдать ошибку (ну и изменения откатываются, конечно) Фактически accountbook содержит записи о приходе/расходе товара. Так вот, триггер просто суммирует остатки с учетом сделанных изменений. Можно ли как-нибудь так же просто на MS SQL? И когда там триггер срабатывает, до проверки foreign keys или после?
И еще, MS SQL вроде блокирует записи, а при изменениях в accountbook много записей в WH_REMAIN изменяется, это остатки на конец дня. Другие пользователи смогут работать? Правда, при тесте на 500000 записей (10 лет) IB обрабатывал запись в середине за 2-3 сек, но все равно нежелательно, если будет deadlock.
2Polevi: спасибо, сместо некоторых процедур пойдут view, это я уже понял
2Eduard: а транзакцию откатывать надо?


 
Kapusto ©   (2002-07-26 15:04) [5]

По порядку.
1. Триггер срабатывает _после_ проверки всех констрайнтов, так что каскадное удаление на триггерах и просто foreign key не совместимы
2. делаешь raiserror, rollback transaction
3. Все зависит от того, как настроишь уровни изоляции и блокировки

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


 
Romkin ©   (2002-07-26 15:35) [6]

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


 
Kapusto ©   (2002-07-26 15:51) [7]

Лично я бы всю твою логику перенес бы из триггеров на ХП, отобрал бы у пользователей все права на таблицы, кроме select...
А насчет быстрее ли будет работать - завсит от того, кто будет рулить серваком, и на чем он будет крутиться...
При равных не особо благоприятных условиях (админ - лох, тачка слабая) IB имхо в сильном выигрыше...


 
Romkin ©   (2002-07-26 16:19) [8]

Ему еще и админ нужен?! Постоянно? Зачем?
тачка в принципе средняя - PIII-600 128 метров... Правда, как для MSSQL - не знаю, IB на такой будет держать коннектов 20-30 без проблем и задержек. А вот сбережения питания нет, для MS SQL критичны обрывы питания?
А насчет прав пользователей - я их не писал, изменения метаданных закрыты.
из триггеров на ХП... Этож какое приложение получиться - брать данные из select, а изменять ХП, да еще и отдельной ХП на обновление/удалени/изменение? Замучаешься запросы на клиенте писать, сейчас-то все автоматически. Да и структура пострадает, а ее описывать. И что писать в руководстве к базе?
Кошмар...
Выходит, все переписывать заново :-((




 
Delirium ©   (2002-07-26 16:35) [9]

А если уж переделывать заново - стоит отказаться от бизнес-логики в триггерах, а перенести её в ХП. И вообще при проектировании серьёзной БД, нужно стразу определяться с правилами внесения изменений - разумеется исключительно через те-же хранимые процедуры.


 
Delirium ©   (2002-07-26 16:47) [10]

Для MSSQL2000 "PIII-600 128 метров" на "коннектов 20-30" хватит за глаза


 
Kapusto ©   (2002-07-26 16:59) [11]

2Romkin: Хотелось бы мне посмотреть, как ты в триггере на обновление будешь обновлять ту же самую таблицу :)
а насчет отдельных процедур - ну у тебя же трехзвенка, все можно автоматизировать на сервере приложений...


 
Shaman_Naydak ©   (2002-07-26 19:43) [12]


> Kapusto © (26.07.02 16:59)

Без проблем, уверяю тебя!
> Romkin
Мы в свое время тестировали, получалось намного быстрее, однако..
Но не буду распространяться, так как корректность теста, да еще и на разные БД - это флеймовая тема



Страницы: 1 вся ветка

Текущий архив: 2002.08.22;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
3-71043
Black Cat
2002-08-01 15:27
2002.08.22
Oracle и


1-71146
SS1
2002-08-13 14:10
2002.08.22
День недели из даты


1-71194
Katie
2002-08-09 20:17
2002.08.22
установка RxLib v 2.75


3-70959
Noname123
2002-08-02 23:18
2002.08.22
Execl в Delphi 6


4-71434
VDen
2002-06-13 12:45
2002.08.22
Обои на рабочий стол