Написание кросс-проверок 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 запрос не смог быть выполнен )