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

Откуда: Рашен Федерэйшен
Сообщений: 2272
К нам тут нового человека взяли, который "будет отвечать за бд, хранимые процедуры итд"

дык вот этот человек выкатил некий общий шаблон для всех хранимых процедур


1) Контроль значений передаваемых в процедуру переменных
2) Контроль действий в хранимой процедуре
3) Транзакционная целостность выполнения всей хранимой процедуры
4) В случае обнаружения проблем: прерывание работы и откат сделанных изменений.

DECLARE @localtran bit = 0
DECLARE @NameTran nvarchar(20) = N'test_control_tran'
BEGIN TRY
   -- Если нужно - проверяем доступ пользователя
    /* IF IS_MEMBER('DatabaseRole') = 0 RAISERROR(...) */
   -- Проверка входных параметров
   IF (@id = 0) or @id is null RAISERROR(50100, 16, 1, N'id', @id)
   -- Если проверки пройдены,
   -- начинаем именованную транзакцию или создаем именованный чекпойнт
   IF @@TRANCOUNT = 0 BEGIN TRANSACTION @NameTran 
                 ELSE SAVE TRANSACTION @NameTran
   SET @localtran = 1
   -- Блок операторов с контролем их выполнения
   DELETE FROM deltest where id = @id
   IF @@ROWCOUNT > 0 RAISERROR(50020, 16, 1)
   -- Лог успешного выполнения
   PRINT 'Выполнение процедуры продолжено!!!'
   COMMIT TRANSACTION @NameTran
END TRY

BEGIN CATCH
    DECLARE @ErrorMessage NVARCHAR(2048);
    DECLARE @ErrorProcedure NVARCHAR(126);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;
    SELECT 
        @ErrorMessage = ERROR_MESSAGE(),
        @ErrorProcedure = ERROR_PROCEDURE(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE();
    -- Откат только именованной транзакции, если она уже началась
    IF @localtran = 1 ROLLBACK TRANSACTION @NameTran
    -- Лог exception
    PRINT 'Выполнение процедуры прервано!!!'
    -- Передача сообщения об ошибке с текстом ошибки и именем хранимой процедуры
    RAISERROR (50030, @ErrorSeverity, @ErrorState, @ErrorMessage, @ErrorProcedure);
END CATCH


что скажете, господа?

мне вообще непонятно зачем этот блок
-- начинаем именованную транзакцию или создаем именованный чекпойнт
   IF @@TRANCOUNT = 0 BEGIN TRANSACTION @NameTran 
                 ELSE SAVE TRANSACTION @NameTran

27 дек 10, 14:24    [10005347]     Ответить | Цитировать Сообщить модератору
 Re: Просьба покритиковать общий шаблон для хранимых процедур  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
CmeTanka,

мне непонятно зачем весь этот код вообще:)
где например выбор или проверка уровня изоляции транзакции?
а что предполагается делать если try не сработает например на ошибках с разрывом соединения с базой уровня больше 20?
27 дек 10, 14:45    [10005511]     Ответить | Цитировать Сообщить модератору
 Re: Просьба покритиковать общий шаблон для хранимых процедур  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
CmeTanka,
Имхо, странно что для всех процедур.

У нас например сделано проще, "обычные" процедуры имеют четкую цель и вызываются во внешней транзакции, соотв. либо процедура полностью проходит, либо нет и цель либо достигута, либо нет.
Процедура внутри которой идет работа с данными с разных серверов БД, веб сервисов и т.д. - находится в, так называемом, слое бизнес логики. И в ней, согласно этой логике, определены правила, как поступать если какая-то из внутренних процедур не сработает, откатывать всю транзакцию, либо допустимо успешно завершить транзакцию, либо для каких-тов случае ошибок логировать и идти дальше, либо прерывать все целиком.
А для всех целиком такое нагромождение относительно транзакций лично мне кажется лишним...
27 дек 10, 15:21    [10005824]     Ответить | Цитировать Сообщить модератору
 Re: Просьба покритиковать общий шаблон для хранимых процедур  [new]
лолл
Member

Откуда:
Сообщений: 450
CmeTanka,

ваш новый человек должно быть долго кодил в замкнутом пространстве и лишь спустя время выбрался наружу и пришел к вам (имхо). Действительно непонятно, зачем ему нужно все усложнять... Быть может перед ним была поставлена задача, о которой вы нам не сообщили?
27 дек 10, 19:12    [10007193]     Ответить | Цитировать Сообщить модератору
 Re: Просьба покритиковать общий шаблон для хранимых процедур  [new]
Crimean
Member

Откуда:
Сообщений: 13147
судя по шаблону, у вас предполагается развитая многоуровневая система хранимок, которые вызывают друг друга. но в этом контексте использование try/catch, мягко говоря, стремно. поскольку во-первых теряется изначальное исключение а во-вторых тот кто писал недочитал статью про try/catch и/или не влетал в ситуации, когда в catch нужно сделать rollback
на всякий случай напоминаю, что для "простых" ситуаций есть шикарный паттерн с xact_abort
и - да - учтите, "лишние" сэйвпоинты пожрут скорость работы
27 дек 10, 19:26    [10007247]     Ответить | Цитировать Сообщить модератору
 Re: Просьба покритиковать общий шаблон для хранимых процедур  [new]
_dodgy_
Member

Откуда:
Сообщений: 108
может интересно:

https://www.sql.ru/forum/actualthread.aspx?tid=854275

Хотя у тебя понавороченнее. Спасибо что выложил. Нереально проимпрувил мои абилитис :)
27 май 11, 13:12    [10719150]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить