SQL-скрипт потокового создания триггеров в базе геоданных

Печать Предыдущая страница Стартовая страница

Ниже приведено содержимое скрипта make_triggers_for_objectid.sql, предназначенного для создания триггеров, выполняющих получение нового значения для поля идентификатора записи OBJECTID для всех таблиц с пространственными данными, зарегистрированных в базе геоданных ArcSDE в базе данных Oracle.

 

-- ==============================================================================

--  Создание триггеров для генерации значений OBJECTID новых записей,

--  добавляемых в таблицы базы геоданных ArcSDE не из приложений ArcGIS

-- ==============================================================================

-- Для получения OBJECTID используется штатная функция ArcSDE - GDB_UTIL.NEXT_ROWID

-- ==============================================================================

 

DECLARE

 v_username  ST_GEOMETRY_COLUMNS.OWNER%TYPE; -- переменная для имени владельца

 v_tablename GDB_ITEMS.NAME%TYPE;            -- переменная для имени таблицы

 v_tablename_short GDB_ITEMS.NAME%TYPE;      -- переменная для имени таблицы

 v_shapename ST_GEOMETRY_COLUMNS.OWNER%TYPE; -- переменная для имени поля метрики

 v_srid      ST_GEOMETRY_COLUMNS.SRID%TYPE;  -- переменная для значения SRID поля

 v_srid_str  VARCHAR2(32);

 v_sql       VARCHAR2(4096);

 l NUMBER;

 CURSOR c1

 IS -- курсор для перечисления таблиц с геометрией и их PK

   -- ========================================================================

      SELECT  

        USER as TableOwner,

        REPLACE(t.NAME, USER||'.', '') as TableName,

        c.COLUMN_NAME as ShapeName,

        c.SRID as SRID

      FROM GDB_ITEMRELATIONSHIPS r

      INNER JOIN GDB_ITEMS t ON t.UUID=r.DESTID

      INNER JOIN GDB_ITEMS l ON l.UUID=r.ORIGINID

      INNER JOIN GDB_ITEMRELATIONSHIPTYPES rt ON rt.UUID=r.TYPE AND rt.NAME='DatasetInFeatureDataset'

      LEFT OUTER JOIN ST_GEOMETRY_COLUMNS c ON UPPER(c.OWNER||'.'||c.TABLE_NAME)=UPPER(t.NAME) AND UPPER(c.GEOMETRY_TYPE) like 'ST_GEOMETRY%'

      WHERE UPPER(t.NAME) like UPPER(USER||'.%')

      ORDER BY rt.NAME;

 -- ========================================================================

BEGIN

 DBMS_OUTPUT.ENABLE();

 DBMS_OUTPUT.PUT_LINE( 'Begin...' );

 OPEN c1;

 LOOP

     v_sql := '';

     FETCH c1 INTO v_username, v_tablename, v_shapename, v_srid;

     EXIT WHEN c1%NOTFOUND;

     DBMS_OUTPUT.PUT_LINE( v_tablename || ' :');

     DBMS_OUTPUT.PUT_LINE( '  - append trigger for new objectid');

     l := LENGTH(v_tablename);

     -- максимальная длина имени триггера - 30 символов

     IF (l <= 21)

       THEN v_tablename_short := v_tablename;

       ELSE v_tablename_short := SUBSTR(v_tablename, 1, 19) || '_' || SUBSTR(v_tablename, l, 1);

     END IF;  

     

     -- SELECT SUBSTR(v_tablename, 1, 21) INTO v_tablename_short FROM DUAL;

     -- добавление триггера для получения нового значения OBJECTID

     v_sql := 'CREATE OR REPLACE TRIGGER TR_' || v_tablename_short || '_NEWID ' ||

              'BEFORE INSERT OR UPDATE ON ' || v_username || '.' || v_tablename || ' ' ||

              'FOR EACH ROW ' ||

              'BEGIN ' ||

              'IF :NEW.OBJECTID IS NULL ' ||

              'THEN SELECT GDB_UTIL.NEXT_ROWID(''' || v_username || ''',''' || v_tablename || ''') ' ||

              'INTO :NEW.OBJECTID FROM DUAL; ' ||

              'END IF;  ' ||

              'END; ';

             

     BEGIN        

        EXECUTE IMMEDIATE v_sql; -- запуск

     EXCEPTION

        WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE( '         - ERROR!');

     END;

     

 END LOOP;

 CLOSE c1;

END;

/