Project

General

Profile

« Previous | Next » 

Revision 11696

schemas/vegbien.sql: sync_analytical_stem_to_view(): use new util.force_recreate() instead of manually dropping and re-creating every view that uses this. this avoids the need to add several lines to this function every time we add a new scientific view (of which we expect to have many), because force_recreate()'s error parsing handles this automatically. this makes it possible for a non-expert user to add scientific views without compromising the ability to add columns to analytical_stem_view, because they don't need to understand Postgres's dependency error messages when updating analytical_stem with this function.

View differences:

schemas/vegbien.sql
1220 1220
--
1221 1221

  
1222 1222
CREATE FUNCTION sync_analytical_stem_to_view() RETURNS void
1223
    LANGUAGE plpgsql
1224
    AS $$
1225
DECLARE
1226
    analytical_plot_def text := NULL;
1227
    analytical_specimen_def text := NULL;
1228
    provider_count_view_def text := NULL;
1229
    range_modeling_input_def text := NULL;
1230
BEGIN
1231
    -- Save and drop dependent objects
1232
    BEGIN
1233
        analytical_plot_def :=
1234
            'CREATE OR REPLACE VIEW analytical_plot AS '
1235
            ||pg_get_viewdef('analytical_plot');
1236
        DROP VIEW analytical_plot;
1237
    EXCEPTION
1238
        WHEN undefined_table THEN NULL;
1239
    END;
1240
    BEGIN
1241
        analytical_specimen_def :=
1242
            'CREATE OR REPLACE VIEW analytical_specimen AS '
1243
            ||pg_get_viewdef('analytical_specimen');
1244
        DROP VIEW analytical_specimen;
1245
    EXCEPTION
1246
        WHEN undefined_table THEN NULL;
1247
    END;
1248
    BEGIN
1249
        provider_count_view_def :=
1250
            'CREATE OR REPLACE VIEW provider_count_view AS '
1251
            ||pg_get_viewdef('provider_count_view');
1252
        DROP VIEW provider_count_view;
1253
    EXCEPTION
1254
        WHEN undefined_table THEN NULL;
1255
    END;
1256
    BEGIN
1257
        range_modeling_input_def :=
1258
            'CREATE OR REPLACE VIEW range_modeling_input AS '
1259
            ||pg_get_viewdef('range_modeling_input');
1260
        DROP VIEW range_modeling_input;
1261
    EXCEPTION
1262
        WHEN undefined_table THEN NULL;
1263
    END;
1264
    
1265
    DROP TABLE IF EXISTS analytical_stem;
1266
    CREATE TABLE analytical_stem AS SELECT * FROM analytical_stem_view LIMIT 0;
1267
    ALTER TABLE analytical_stem ADD COLUMN taxon_occurrence__pkey serial PRIMARY KEY;
1268
    
1269
    GRANT SELECT ON TABLE analytical_stem TO bien_read;
1270
    GRANT SELECT ON TABLE analytical_stem_view TO bien_read;
1271
    
1272
    ALTER TABLE analytical_stem ADD FOREIGN KEY (datasource) REFERENCES source (shortname) ON UPDATE CASCADE ON DELETE CASCADE;
1273
    
1274
    ALTER TABLE analytical_stem ALTER COLUMN "datasource" SET NOT NULL;
1275
    ALTER TABLE analytical_stem ALTER COLUMN "locationID" SET NOT NULL;
1276
    
1277
    CREATE INDEX ON analytical_stem ("datasource", "occurrenceID");
1278
    CREATE INDEX ON analytical_stem ("datasource", "specimenHolderInstitutions", "collection", "accessionNumber");
1279
    CREATE INDEX ON analytical_stem ("datasource", "projectID", "locationID", "eventDate");
1280
    CREATE INDEX ON analytical_stem ("scrubbed_morphospecies_binomial");
1281
    
1282
    -- Re-create dependent objects
1283
    IF analytical_plot_def IS NOT NULL THEN
1284
        EXECUTE analytical_plot_def;
1285
        GRANT SELECT ON TABLE analytical_plot TO bien_read;
1286
    END IF;
1287
    IF analytical_specimen_def IS NOT NULL THEN
1288
        EXECUTE analytical_specimen_def;
1289
        GRANT SELECT ON TABLE analytical_specimen TO bien_read;
1290
    END IF;
1291
    IF provider_count_view_def IS NOT NULL THEN
1292
        EXECUTE provider_count_view_def;
1293
        GRANT SELECT ON TABLE provider_count_view TO bien_read;
1294
        GRANT SELECT ON TABLE provider_count_view TO public_;
1295
    END IF;
1296
    IF range_modeling_input_def IS NOT NULL THEN
1297
        EXECUTE range_modeling_input_def;
1298
        GRANT SELECT ON TABLE range_modeling_input TO bien_read;
1299
    END IF;
1300
END;
1301
$$;
1223
    LANGUAGE sql
1224
    AS $_$
1225
SELECT util.force_recreate($$
1226
DROP TABLE IF EXISTS analytical_stem;
1227
CREATE TABLE analytical_stem AS SELECT * FROM analytical_stem_view LIMIT 0;
1228
ALTER TABLE analytical_stem ADD COLUMN taxon_occurrence__pkey serial PRIMARY KEY;
1302 1229

  
1230
GRANT SELECT ON TABLE analytical_stem TO bien_read;
1231
GRANT SELECT ON TABLE analytical_stem_view TO bien_read;
1303 1232

  
1233
ALTER TABLE analytical_stem ADD FOREIGN KEY (datasource) REFERENCES source (shortname) ON UPDATE CASCADE ON DELETE CASCADE;
1234

  
1235
ALTER TABLE analytical_stem ALTER COLUMN "datasource" SET NOT NULL;
1236
ALTER TABLE analytical_stem ALTER COLUMN "locationID" SET NOT NULL;
1237

  
1238
CREATE INDEX ON analytical_stem ("datasource", "occurrenceID");
1239
CREATE INDEX ON analytical_stem ("datasource", "specimenHolderInstitutions", "collection", "accessionNumber");
1240
CREATE INDEX ON analytical_stem ("datasource", "projectID", "locationID", "eventDate");
1241
CREATE INDEX ON analytical_stem ("scrubbed_morphospecies_binomial");
1242
$$);
1243
$_$;
1244

  
1245

  
1304 1246
--
1305 1247
-- Name: sync_geoscrub_input_to_view(); Type: FUNCTION; Schema: public; Owner: -
1306 1248
--

Also available in: Unified diff