Контроль целостности типов документов
Материал из GedeminWiki
(Различия между версиями)
SYSDBA (обсуждение | вклад) (Новая страница: «Приведенный ниже код создает для каждой таблицы документа триггер, который проверяет со…») |
SYSDBA (обсуждение | вклад) |
||
| Строка 7: | Строка 7: | ||
DECLARE VARIABLE id INTEGER; | DECLARE VARIABLE id INTEGER; | ||
DECLARE VARIABLE relname VARCHAR(1024); | DECLARE VARIABLE relname VARCHAR(1024); | ||
| − | DECLARE VARIABLE | + | DECLARE VARIABLE dtkeys VARCHAR(1024); |
BEGIN | BEGIN | ||
FOR | FOR | ||
| Строка 20: | Строка 20: | ||
1, 2 | 1, 2 | ||
INTO | INTO | ||
| − | :id, :relname, : | + | :id, :relname, :dtkeys |
DO BEGIN | DO BEGIN | ||
stmt = | stmt = | ||
| Строка 31: | Строка 31: | ||
'BEGIN ' || | 'BEGIN ' || | ||
' SELECT documenttypekey FROM gd_document WHERE id = NEW.documentkey INTO :dtkey;' || | ' SELECT documenttypekey FROM gd_document WHERE id = NEW.documentkey INTO :dtkey;' || | ||
| − | ' IF (NOT (:dtkey IN (' || : | + | ' IF (NOT (:dtkey IN (' || :dtkeys || '))) THEN ' || |
' EXCEPTION gd_e_exception ''Document type doesn`t match table ' || :relname || ''';' || | ' EXCEPTION gd_e_exception ''Document type doesn`t match table ' || :relname || ''';' || | ||
'END'; | 'END'; | ||
Версия 16:45, 11 января 2018
Приведенный ниже код создает для каждой таблицы документа триггер, который проверяет соответствие этой таблицы типу документа из поля GD_DOCUMENT.DOCUMENTTYPEKEY:
EXECUTE BLOCK AS DECLARE VARIABLE stmt VARCHAR(2048); DECLARE VARIABLE id INTEGER; DECLARE VARIABLE relname VARCHAR(1024); DECLARE VARIABLE dtkeys VARCHAR(1024); BEGIN FOR SELECT hr.id, hr.relationname, LIST(dt.id) FROM gd_documenttype dt JOIN at_relations hr ON hr.id = dt.HEADERRELKEY GROUP BY 1, 2 INTO :id, :relname, :dtkeys DO BEGIN stmt = 'CREATE OR ALTER TRIGGER gd_check_dt_' || :id || ' FOR ' || :relname || ' ACTIVE ' || ' AFTER INSERT OR UPDATE ' || ' POSITION 32000 ' || 'AS ' || ' DECLARE VARIABLE dtkey INTEGER = NULL; ' || 'BEGIN ' || ' SELECT documenttypekey FROM gd_document WHERE id = NEW.documentkey INTO :dtkey;' || ' IF (NOT (:dtkey IN (' || :dtkeys || '))) THEN ' || ' EXCEPTION gd_e_exception ''Document type doesn`t match table ' || :relname || ''';' || 'END'; EXECUTE STATEMENT :stmt WITH AUTONOMOUS TRANSACTION; END END