Skip to main content

Написание кросс-проверок c помощью SQL

Общие сведения

  • Кросс-проверка это SQL-код который выполняется на базе данных каждый раз при изменении записей в таблице ( в том числе при редактировании записи через интерфейс, изменении записи через API и  загрузки данных из Execel )
  • SQL Запрос кросс-проверки должен вернуть одну или более строк, в случае если произошла ошибка и изменения в таблице применить нельзя, при этом происходит откат транзакции и все применённые изменения отменяются.
  • Кросс-проверка может быть Предупреждением, в таком случае откат данных не происходит, но пользователю высвечивается уведомление об сработавшей проверке
  • Если в тексте кросс-проверки требуется использовать символ %, то его необходимо заменить на последовательность  "%%" (без кавычек)
  • Т.к. Кросс-проверка срабатывает при любом штатном изменении таблицы, она может быть использована для обновления данных в этой или смежных таблицах

Написание кросс-проверки для валидации данных

SQL-Запрос такой проверки, как сказано выше, должен, в случае провала проверки, вернуть одну или несколько строчек. После этого для каждой строки результата будет сформировано сообщение об ошибки на основании шаблона указанного в поле "Сообщение при неуспешном срабатывании". Все эти сообщения будут объединены в одно и отображены пользователю либо как ошибка, либо как предупреждение

Формирование сообщения на основе шаблона.

Шаблон, указанный в поле  "Сообщение при  неуспешном срабатывании", должен содержать специальную последовательность символов "{}" (без кавычек), на место таких последовательностей будут подставляться значения столбцов из строки с ошибкой. Например:

SQL запрос
Шаблон
Результирующая ошибка
select 1,2,3,4
Первый {}, второй {}, третий {}, четвёртый {}
Первый 1, второй 2, третий 3, четвёртый 4

select 'Вася' ,2,3,4

union all

select 'Петя' ,2,8,4

Для пользователя {} запрещено {},{},{}.
Для пользователя Вася запрещено 2,3,4.Для пользователя Петя запрещено 2,8,4.

Ограничение проверки только изменённой строкой

Для того чтобы кросс-проверка проверяла не весь массив строк ( что может быть долго и не иметь смысл ), система данной кросс-проверке может передать параметр - номер изменённой строки. Для этого в нужном месте запроса вставить последовательность "%s" без кавычек. 

Передаваемый параметр может быть либо числом, либо строкой NULL (в случае если было множественное изменение). 

Несколько примеров

SQL запрос кросспроверки
Значение параметра
Итоговый запрос, выполненный на базе данных
Комментарий
select 1 where '222' like '%%'
123
select 1 where '222' like '%'
Запрос не был изменён, т.к. не ожидал подстановки параметра. Последовательность %% заменена на %
select %s
123
select 123 В запрос был подставлен параметр
select %s NULL
select NULL
В запрос был подставлен параметр

Написание кросс-проверки для обновление данных

Кросс-проверка такого типа не должна никогда возвращать строки. Для этого в SQL запрос обновления нужных данных  после точки с запятой добавить запрос "select 0 where 1=0;", таким образом кросс-проверка будет всегда считаться успешной ( за исключением случаев, когда по тем или иным причинам SQL запрос не смог быть выполнен )