альтернатива sp_addmessage
От: kgrach Россия  
Дата: 20.09.17 09:23
Оценка:
Дано MS SQL, в котором заводятся шаблоны сообщений на разных языках с помощью sp_addmessage.

Проблема в том, что клиент забекапил БД, провел апгрейд SQL сервера, разбекапил БД и все, сообщения все потерялись.
Задолбало. Можно эти шаблоны спустить на уровень БД или чем нибудь их заменить?
Re: альтернатива sp_addmessage
От: wildwind Россия  
Дата: 20.09.17 10:31
Оценка:
Здравствуйте, kgrach, Вы писали:

K>Дано MS SQL, в котором заводятся шаблоны сообщений на разных языках с помощью sp_addmessage.


K>Проблема в том, что клиент забекапил БД, провел апгрейд SQL сервера, разбекапил БД и все, сообщения все потерялись.

Что, и скриптов не осталось?

K>Задолбало. Можно эти шаблоны спустить на уровень БД или чем нибудь их заменить?

Можно транслировать их в приложении. Написать кучу кода для этого, натыкать обработчиков во всех возможных местах.
Но стоит ли?
Re[2]: альтернатива sp_addmessage
От: kgrach Россия  
Дата: 20.09.17 11:22
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Здравствуйте, kgrach, Вы писали:


K>>Дано MS SQL, в котором заводятся шаблоны сообщений на разных языках с помощью sp_addmessage.


K>>Проблема в том, что клиент забекапил БД, провел апгрейд SQL сервера, разбекапил БД и все, сообщения все потерялись.

W>Что, и скриптов не осталось?

Все скрипты на месте.

K>>Задолбало. Можно эти шаблоны спустить на уровень БД или чем нибудь их заменить?

W>Можно транслировать их в приложении. Написать кучу кода для этого, натыкать обработчиков во всех возможных местах.
W>Но стоит ли?

Ну вот и хочется всего лишь перетащить их на уровень БД.
Re: альтернатива sp_addmessage
От: Milena США  
Дата: 20.09.17 16:40
Оценка:
Здравствуйте, kgrach, Вы писали:

K>Дано MS SQL, в котором заводятся шаблоны сообщений на разных языках с помощью sp_addmessage.

.

K>Проблема в том, что клиент забекапил БД, провел апгрейд SQL сервера, разбекапил БД и все, сообщения все потерялись.

K>Задолбало. Можно эти шаблоны спустить на уровень БД или чем нибудь их заменить?


Эти сообщения хранятся в master db. Нужно один раз написать скрипт экспорта-импорта этих сообщений, чтобы после апгрейда просто его запустить.
Альтернативно, можно просто создать табличку в своей базе с такой же структурой, все туда перенести, и потом код просто будет читать оттуда. Я не совсем понимаю, в чем сложность?
Re: альтернатива sp_addmessage
От: Olaf Россия  
Дата: 21.09.17 02:55
Оценка:
Здравствуйте, kgrach, Вы писали:

K>Проблема в том, что клиент забекапил БД, провел апгрейд SQL сервера, разбекапил БД и все, сообщения все потерялись.

K>Задолбало. Можно эти шаблоны спустить на уровень БД или чем нибудь их заменить?

Вариантов у вас немного, если оставаться в рамках T-SQL.

1. Изменить обслуживание БД, т.е. создать справочную таблицу, которая содержит все сообщения. В процедуру восстановления БД добавить пункт вызова ХП (запроса), которая создает по справочной таблице все сообщения на сервере.

2. Либо велосипедировать, если у вас SQL Server 2012+.
Например, инструкция THROW позволяет генерировать исключения с любым кодом от 50000 до 2147483647, без предварительного добавления записей в sys.messages Однако есть пара ограничений — первое, уровень серьезности ошибки всегда 16, второе она не поддерживает многоязыковость и стиль формата printf. Для решения второй проблемы вам необходимо будет создать всё ту же справочную таблицу со всеми языками и кодами в БД. И при генерации ошибки использовать FORMATMESSAGE, завернув это как-то красиво в функцию, например:
declare @err int = 55555
declare @msg nvarchar(2048)

select @msg = formatmessage(text, 'ПРОВЕРКА')
from sys.messages sm
join sys.syslanguages l on l.langid = @@langid and l.msglangid = sm.language_id
where sm.message_id = 21665;

throw @err, @msg, 1;

В запросе с sys.messages и sys.syslanguages вы используете свою справочную таблицу в БД, я использовал их только для демонстрации.
Re[2]: альтернатива sp_addmessage
От: kgrach Россия  
Дата: 21.09.17 03:55
Оценка:
Здравствуйте, Milena, Вы писали:

M>Здравствуйте, kgrach, Вы писали:


M>Эти сообщения хранятся в master db. Нужно один раз написать скрипт экспорта-импорта этих сообщений, чтобы после апгрейда просто его запустить.

M>Альтернативно, можно просто создать табличку в своей базе с такой же структурой, все туда перенести, и потом код просто будет читать оттуда. Я не совсем понимаю, в чем сложность?

Смотрите, есть триггеры на таблицах, которые при удалении записи проверяют, что на нее не ссылаются записи из других таблиц. (Дизайн такой)

Если в процессе проверки выясняется, что ссылается имеется, триггер вызывает
RAISERROR с кодом сообщения (которые более 50000) и аргументами.

Далее запросы к БД делает прикладное ПО.
ПО при обработке ошибок смотрит, если код ошибки больше 50000, то это сообщение специально отправляется пользователю, чтобы он сразу понимал, в чем дело.
Если код ошибки меньше 50000 то отправляется маловразумительное сообщение "Ошибка".

Из-за переездов БД на другие экземпляры SQL сервера эти сообщения теряются.
В этом случае при удалении записи, на которую есть ссылка, код ошибки меняется на 18 тыс че-то там и клиент получает "Ошибка" и не понимает почему.
И чисто клиентская проблема превращается проблему поддержки, разработчиков
Начинается заказ логов их анализ, отправка скриптов с этими сообщениями.
И это не разовая ситуация, а регулярно повторяющаяся.

Хочется, получить функциональность RAISERROR, но только, чтобы сообщения жили в БД.
Re[2]: альтернатива sp_addmessage
От: kgrach Россия  
Дата: 21.09.17 04:21
Оценка:
Здравствуйте, Olaf, Вы писали:

O>Здравствуйте, kgrach, Вы писали:


K>>Проблема в том, что клиент забекапил БД, провел апгрейд SQL сервера, разбекапил БД и все, сообщения все потерялись.

K>>Задолбало. Можно эти шаблоны спустить на уровень БД или чем нибудь их заменить?

O>Вариантов у вас немного, если оставаться в рамках T-SQL.


O>1. Изменить обслуживание БД, т.е. создать справочную таблицу, которая содержит все сообщения. В процедуру восстановления БД добавить пункт вызова ХП (запроса), которая создает по справочной таблице все сообщения на сервере.


Нет такого регламента. Каждый клиент, как умеет так и разворачивает БД и как правило нас даже об этом не уведомляют.
Само ПО тоже не в состоянии накатить эти сообщения т.к. для sp_addmessage требуются админские роли у учетной записи, а некоторые клиенты принципиально отказываются выдавать такие роли учетным записям.
ПО конечно может проверить, что сообщения отсутствуют и проинформировать, но это все полумеры.

А может быть есть какой-то механизм на SQL Server, который автоматом запускается после рестора бекапа и позволяет выполнить клиентский SQL код?


O>2. Либо велосипедировать, если у вас SQL Server 2012+.

O>Например, инструкция THROW позволяет генерировать исключения с любым кодом от 50000 до 2147483647, без предварительного добавления записей в sys.messages Однако есть пара ограничений — первое, уровень серьезности ошибки всегда 16, второе она не поддерживает многоязыковость и стиль формата printf. Для решения второй проблемы вам необходимо будет создать всё ту же справочную таблицу со всеми языками и кодами в БД. И при генерации ошибки использовать FORMATMESSAGE, завернув это как-то красиво в функцию, например:
O>
O>declare @err int = 55555
O>declare @msg nvarchar(2048)

O>select @msg = formatmessage(text, 'ПРОВЕРКА')
O>from sys.messages sm
O>join sys.syslanguages l on l.langid = @@langid and l.msglangid = sm.language_id
O>where sm.message_id = 21665;

O>throw @err, @msg, 1;
O>

O>В запросе с sys.messages и sys.syslanguages вы используете свою справочную таблицу в БД, я использовал их только для демонстрации.

Про это тоже думал, но не у всех клиентов развернут SQL 2012 и выше.
Re[3]: альтернатива sp_addmessage
От: wildwind Россия  
Дата: 21.09.17 05:24
Оценка:
Здравствуйте, kgrach, Вы писали:

K>Нет такого регламента. Каждый клиент, как умеет так и разворачивает БД и как правило нас даже об этом не уведомляют.


Пытаетесь административную проблему решить тех. средствами?

K>А может быть есть какой-то механизм на SQL Server, который автоматом запускается после рестора бекапа и позволяет выполнить клиентский SQL код?


Триггер на логон, ругающийся "вы не до конца установили/восстановили БД. Запустите то-то и то-то".

"То-то" может быть ваше приложение с ключом -installmessages.
Re[3]: нашел решение
От: kgrach Россия  
Дата: 21.09.17 06:55
Оценка: 64 (1)
M>>Здравствуйте, kgrach, Вы писали:

K>Хочется, получить функциональность RAISERROR, но только, чтобы сообщения жили в БД.


Оказывается, если вызвать RAISERROR без кода сообщения то код ошибки будет 50000 и механизм обработки в ПО можно не менять.
Далее в триггере вместо RAISERROR вызывается ХП, которая уже живет в БД форматирует сообщение и вызывает RAISERROR с сообщением.
Все
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.