Контроль целостности типов документов

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
Строка 4: Строка 4:
 
EXECUTE BLOCK
 
EXECUTE BLOCK
 
AS
 
AS
  DECLARE VARIABLE stmt VARCHAR(2048);
 
 
   DECLARE VARIABLE id INTEGER;
 
   DECLARE VARIABLE id INTEGER;
 
   DECLARE VARIABLE relname VARCHAR(1024);
 
   DECLARE VARIABLE relname VARCHAR(1024);
Строка 22: Строка 21:
 
       :id, :relname, :dtkeys
 
       :id, :relname, :dtkeys
 
   DO BEGIN
 
   DO BEGIN
     stmt =
+
     EXECUTE STATEMENT
 
       'CREATE OR ALTER TRIGGER gd_check_dt_' || :id || ' FOR ' || :relname ||
 
       'CREATE OR ALTER TRIGGER gd_check_dt_' || :id || ' FOR ' || :relname ||
 
       '  ACTIVE ' ||
 
       '  ACTIVE ' ||
Строка 33: Строка 32:
 
       '  IF (NOT (:dtkey IN (' || :dtkeys || '))) THEN ' ||
 
       '  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'
    EXECUTE STATEMENT :stmt WITH AUTONOMOUS TRANSACTION;
+
      WITH AUTONOMOUS TRANSACTION;
 
   END
 
   END
 
END
 
END

Версия 16:49, 11 января 2018

Приведенный ниже код создает для каждой таблицы документа триггер, который проверяет соответствие этой таблицы типу документа из поля GD_DOCUMENT.DOCUMENTTYPEKEY:

EXECUTE BLOCK
AS
  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
    EXECUTE STATEMENT 
      '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'
      WITH AUTONOMOUS TRANSACTION;
  END
END
Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты