Wprowadzenie do walidacji zapytań SQL
Comarch APS umożliwia wykorzystywanie niestandardowych definicji kolejek SQL do planowania pozycji zleceń. Więcej informacji na temat definiowania i używania tych kolejek SQL znajdziesz w Dokumentacji Użytkownika.
Poniższa dokumentacja określa zasady, według których zapytania SQL są walidowane w systemie.
W systemie Comarch APS, zapytania SQL wykorzystywane do definiowania kolejek podlegają rygorystycznym procesom walidacji. Celem tego procesu jest zapewnienie bezpieczeństwa, stabilności i wydajności systemu. Walidacja odbywa się w kilku etapach, aby zagwarantować, że każde zapytanie jest poprawne składniowo, bezpieczne i zgodne z przeznaczeniem.
Walidacja składni SQL
Pierwszy etap ma na celu wykrycie podstawowych błędów składniowych, zanim zapytanie zostanie poddane dalszej weryfikacji.
Poprawne przykłady
Zapytania, które przechodzą walidację składni, obejmują standardowe operacje SQL.
System jest w stanie poprawnie zinterpretować następujące konstrukcje:
- Proste zapytania SELECT z klauzulą WHERE
SELECT po.id, poe.element_id FROM cdn.production_orders po JOIN cdn.production_order_elements poe ON po.id = poe.production_order_id INSERT INTO cdn.production_orders (id_from_erp, year) VALUES (1, 2025) UPDATE cdn.production_orders SET status=1 WHERE id=1 DELETE FROM cdn.production_orders WHERE id=1 Zapytania, które nie przejdą walidacji, najczęściej zawierają proste błędy, takie jak: SELECT * FROM table WHERE name = 'unterminated string SELECT * FROM table /* unterminated comment SELECT * FROM [unclosed_bracket SELECT * FROM table WHERE (column = 1 SELECT * FROM table WHERE SELECT * FROM FROM table INSERT INTO table VALUES UPDATE table SET Ten etap ma na celu upewnienie się, że Użytkownik przekazał dokładnie jedną instrukcję SQL. Zapobiega to przypadkowemu wykonaniu wielu zapytań (np. SELECT …; SELECT …), co mogłoby prowadzić do nieprzewidzianych skutków. Dozwolone konstrukcje: Niedozwolone instrukcje: SELECT 1; SELECT 2 SELECT 1; DROP TABLE test INSERT INTO table1 …; UPDATE table2 … Jest to kluczowy etap, który blokuje polecenia modyfikujące dane oraz polecenia administracyjne. W tym trybie dozwolone są wyłącznie instrukcje SELECT. Dozwolone: Wyłącznie zapytania SELECT. Niedozwolone: Instrukcje takie jak INSERT , UPDATE , DELETE , DROP , CREATE czy GRANT. Łączenie dozwolonej instrukcji SELECT z niedozwoloną (DROP TABLE) również nie przejdzie walidacji. INSERT INTO cdn.production_orders (id_from_erp, year, month, series, number, plan_from, status, priority, issued_at, update_date) VALUES (1, 2025, 1, 'S’, 1, NOW(), 0, 1, NOW(), NOW()) UPDATE cdn.production_orders SET status=1 WHERE id=1 DELETE FROM cdn.production_order_elements WHERE id=1 DROP SCHEMA IF EXISTS cdn CASCADE; CREATE TABLE cdn.test_table (id SERIAL PRIMARY KEY); GRANT ALL ON SCHEMA cdn TO „ComarchAPS”; SELECT id FROM cdn.production_orders; DROP TABLE cdn.production_orders; Ten etap jest specyficzny dla zapytań służących do planowania, ponieważ muszą one zwracać listę pojedynczych identyfikatorów z tabeli cdn.production_order_elements. Kluczowe reguły: Dozwolone konstrukcje: SELECT id FROM cdn.production_order_elements WHERE status = 1 SELECT poe.id FROM cdn.production_order_elements poe WHERE poe.status = 1 SELECT poe.id FROM cdn.production_order_elements poe JOIN cdn.production_orders po ON poe.production_order_id = po.id WHERE po.status = 1 WITH filtered_elements AS ( SELECT id, status FROM cdn.production_order_elements WHERE status = 1 ) SELECT id FROM filtered_elements SELECT id FROM cdn.production_order_elements WHERE id IN (SELECT id FROM cdn.production_orders WHERE year = 2025) SELECT id FROM cdn.production_order_elements WHERE status = 8 ORDER BY priority DESC limit 10 SELECT id FROM cdn.production_order_elements WHERE status = 8 UNION ALL SELECT id FROM cdn.production_order_elements WHERE priority > 7 Niedozwolone konstrukcje: SELECT id, status FROM cdn.production_order_elements WHERE status = 1 SELECT id FROM cdn.production_orders WHERE status = 1 SELECT po.id FROM cdn.production_order_elements poe JOIN cdn.production_orders po ON poe.production_order_id = po.id WHERE po.status = 1 SELECT * FROM cdn.production_order_elements WHERE status = 1 WITH filtered_elements AS ( SELECT id FROM cdn.production_orders WHERE status = 1 ) SELECT id FROM filtered_elements SELECT poe.id, COUNT(*) as element_count FROM cdn.production_order_elements poe INNER JOIN cdn.production_orders po ON poe.production_order_id = po.id WHERE po.year = 2024 GROUP BY poe.id HAVING COUNT(*) > 1 SELECT id, CASE WHEN priority >= 8 THEN 'HIGH’ WHEN priority >= 5 THEN 'MEDIUM’ ELSE 'LOW’ END as priority_level FROM cdn.production_order_elements Walidacja wykonalności stanowi ostatni etap procesu weryfikacji zapytań SQL w systemie Comarch APS. Jej celem jest szybkie sprawdzenie, czy zapytanie, które przeszło już wcześniejsze walidacje składni, liczby instrukcji oraz trybu tylko do odczytu, rzeczywiście może zostać wykonane bez błędów w środowisku uruchomieniowym. Zasadniczo, jest to test „na żywo”, który symuluje wykonanie zapytania, aby potwierdzić, że nie wystąpią błędy podczas jego faktycznego działania. Ten etap jest kluczowy, ponieważ niektóre problemy nie są możliwe do wychwycenia na wcześniejszych etapach walidacji. Czego dotyczy walidacja wykonalności? Ten etap stanowi ostatnie sito bezpieczeństwa, zapewniając, że tylko w pełni funkcjonalne i bezbłędne zapytania mogą być używane do planowania w Comarch APS.
Najczęściej popełniane błędy
Walidacja liczby instrukcji
Walidacja trybu tylko do odczytu
Walidacja listy ID elementów zleceń
Walidacja wykonalności