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; /
|