diff --git a/README.md b/README.md index ec166ca..f9c0011 100644 --- a/README.md +++ b/README.md @@ -13,9 +13,6 @@ Dependencies * PostgreSQL 9.3+ (with plpythonu extension and xml support) * [PostGIS extension](http://postgis.net) - * [Schema triggers extension] - (https://bitbucket.org/malloclabs/pg_schema_triggers) - (or [fork](https://github.com/CartoDB/pg_schema_triggers)) Install ------- @@ -31,10 +28,6 @@ Test installation make installcheck ``` -NOTE: if ``test_ddl_triggers`` fails it's likely due to an incomplete - installation of schema_triggers: you need to add ``schema_triggers.so`` - to the ``shared_preload_libraries`` setting in postgresql.conf ! - NOTE: you need to run the installcheck as a superuser, use PGUSER env variable if needed, like: PGUSER=postgres make installcheck @@ -47,7 +40,6 @@ In a database that needs to be turned into a "cartodb" user database, run: ```sql CREATE EXTENSION postgis; -CREATE EXTENSION schema_triggers; CREATE EXTENSION cartodb; ``` @@ -63,7 +55,6 @@ be in the "cartodb" schema. ```sql CREATE EXTENSION postgis FROM unpackaged; -CREATE EXTENSION schema_triggers; CREATE EXTENSION cartodb FROM unpackaged; ``` diff --git a/cartodb.control.in b/cartodb.control.in index c331343..a5dcfa0 100644 --- a/cartodb.control.in +++ b/cartodb.control.in @@ -3,4 +3,4 @@ comment = 'Turn a database into a cartodb user database.' superuser = true relocatable = false schema = cartodb -requires = 'plpythonu, schema_triggers, postgis' +requires = 'plpythonu, postgis' diff --git a/expected/test_setup.out b/expected/test_setup.out index c05769f..cb4d895 100644 --- a/expected/test_setup.out +++ b/expected/test_setup.out @@ -1,5 +1,4 @@ CREATE EXTENSION postgis; -CREATE EXTENSION schema_triggers; CREATE EXTENSION plpythonu; CREATE EXTENSION cartodb; CREATE FUNCTION public.cdb_invalidate_varnish(table_name text) diff --git a/scripts-available/CDB_DDLTriggers.sql b/scripts-available/CDB_DDLTriggers.sql deleted file mode 100644 index dddd60e..0000000 --- a/scripts-available/CDB_DDLTriggers.sql +++ /dev/null @@ -1,214 +0,0 @@ --- Table creation --- { -CREATE OR REPLACE FUNCTION cartodb.cdb_handle_create_table () -RETURNS event_trigger SECURITY DEFINER LANGUAGE plpgsql AS $$ -DECLARE - event_info RECORD; - rel RECORD; - newtable REGCLASS; -BEGIN - event_info := schema_triggers.get_relation_create_eventinfo(); - - -- We're only interested in real relations - IF (event_info.new).relkind != 'r' THEN RETURN; END IF; - - SELECT c.relname, c.relnamespace, c.relkind, n.nspname - FROM pg_class c - JOIN pg_namespace n - ON c.relnamespace = n.oid - WHERE c.oid = event_info.relation - INTO rel; - - RAISE DEBUG 'Relation % of kind % created in table % namespace % (oid %)', - event_info.relation, rel.relkind, rel.relname, rel.nspname, rel.relnamespace; - - -- We don't want to react to alters triggered by superuser, - IF current_setting('is_superuser') = 'on' THEN - RAISE DEBUG 'no ddl trigger for superuser'; - RETURN; - END IF; - - PERFORM cartodb.cdb_disable_ddl_hooks(); - - -- CDB_CartodbfyTable must not create tables, or infinite loop will happen - newtable := cartodb.CDB_CartodbfyTable(rel.nspname, event_info.relation); - - PERFORM cartodb.cdb_enable_ddl_hooks(); - - RAISE DEBUG 'Inserting into cartodb.CDB_TableMetadata'; - - -- Add entry to CDB_TableMetadata (should CartodbfyTable do this?) - INSERT INTO cartodb.CDB_TableMetadata(tabname, updated_at) - VALUES (newtable, now()); - -END; $$; --- } - --- Table drop --- { -CREATE OR REPLACE FUNCTION cartodb.cdb_handle_drop_table () -RETURNS event_trigger SECURITY DEFINER LANGUAGE plpgsql AS $$ -DECLARE - event_info RECORD; -BEGIN - event_info := schema_triggers.get_relation_drop_eventinfo(); - - -- We're only interested in real relations - IF (event_info.old).relkind != 'r' THEN RETURN; END IF; - - RAISE DEBUG 'Relation % of kind % dropped from namespace oid %', - event_info.old_relation_oid, (event_info.old).relkind, (event_info.old).relnamespace; - - -- delete record from CDB_TableMetadata (should invalidate varnish) - DELETE FROM cartodb.CDB_TableMetadata WHERE tabname = event_info.old_relation_oid; - -END; $$; --- } - --- Column alter --- { -CREATE OR REPLACE FUNCTION cartodb.cdb_handle_alter_column () -RETURNS event_trigger SECURITY DEFINER LANGUAGE plpgsql AS $$ -DECLARE - event_info RECORD; - rel RECORD; - newtable REGCLASS; -BEGIN - event_info := schema_triggers.get_column_alter_eventinfo(); - - SELECT c.relname, c.relnamespace, c.relkind, n.nspname - FROM pg_class c - JOIN pg_namespace n - ON c.relnamespace = n.oid - WHERE c.oid = event_info.relation - INTO rel; - - RAISE DEBUG 'Column % altered by % (superuser? %) in relation % of kind %', - (event_info.old).attname, current_user, current_setting('is_superuser'), rel.relname, rel.relkind; - - -- We're only interested in real relations - IF rel.relkind != 'r' THEN RETURN; END IF; - - -- We don't want to react to alters triggered by superuser, - IF current_setting('is_superuser') = 'on' THEN - RAISE DEBUG 'no ddl trigger for superuser'; - RETURN; - END IF; - - PERFORM cartodb.cdb_disable_ddl_hooks(); - - newtable := cartodb.CDB_CartodbfyTable(rel.nspname, event_info.relation); - - PERFORM cartodb.cdb_enable_ddl_hooks(); - - -- update CDB_TableMetadata.updated_at (should invalidate varnish) - UPDATE cartodb.CDB_TableMetadata SET updated_at = NOW(), tabname = newtable - WHERE tabname = event_info.relation; - -END; $$; --- } - --- Column drop --- { -CREATE OR REPLACE FUNCTION cartodb.cdb_handle_drop_column () -RETURNS event_trigger SECURITY DEFINER LANGUAGE plpgsql AS $$ -DECLARE - event_info RECORD; - rel RECORD; - newtable REGCLASS; -BEGIN - event_info := schema_triggers.get_column_drop_eventinfo(); - - SELECT c.relname, c.relnamespace, c.relkind, n.nspname - FROM pg_class c - JOIN pg_namespace n - ON c.relnamespace = n.oid - WHERE c.oid = event_info.relation - INTO rel; - - RAISE DEBUG 'Column % drop by % (superuser? %) in relation % of kind %', - (event_info.old).attname, current_user, current_setting('is_superuser'), rel.relname, rel.relkind; - - -- We're only interested in real relations - IF rel.relkind != 'r' THEN RETURN; END IF; - - -- We don't want to react to drops triggered by superuser, - IF current_setting('is_superuser') = 'on' THEN - RAISE DEBUG 'no ddl trigger for superuser'; - RETURN; - END IF; - - - PERFORM cartodb.cdb_disable_ddl_hooks(); - - newtable := cartodb.CDB_CartodbfyTable(rel.nspname, event_info.relation); - - PERFORM cartodb.cdb_enable_ddl_hooks(); - - -- update CDB_TableMetadata.updated_at (should invalidate varnish) - UPDATE cartodb.CDB_TableMetadata SET updated_at = NOW(), tabname = newtable - WHERE tabname = event_info.relation; - -END; $$; --- } - --- Column add --- { -CREATE OR REPLACE FUNCTION cartodb.cdb_handle_add_column () -RETURNS event_trigger SECURITY DEFINER LANGUAGE plpgsql AS $$ -DECLARE - event_info RECORD; - rel RECORD; -BEGIN - event_info := schema_triggers.get_column_add_eventinfo(); - - SELECT c.relname, c.relnamespace, c.relkind, n.nspname - FROM pg_class c - JOIN pg_namespace n - ON c.relnamespace = n.oid - WHERE c.oid = event_info.relation - INTO rel; - - RAISE DEBUG 'Column % added by % (superuser? %) in relation % of kind %', - (event_info.new).attname, current_user, current_setting('is_superuser'), rel.relname, rel.relkind; - - -- We're only interested in real relations - IF rel.relkind != 'r' THEN RETURN; END IF; - - -- We don't want to react to drops triggered by superuser, - IF current_setting('is_superuser') = 'on' THEN - RAISE DEBUG 'no ddl trigger for superuser'; - RETURN; - END IF; - - -- update CDB_TableMetadata.updated_at (should invalidate varnish) - UPDATE cartodb.CDB_TableMetadata SET updated_at = NOW() - WHERE tabname = event_info.relation; - -END; $$; --- } - -CREATE OR REPLACE FUNCTION cartodb.cdb_disable_ddl_hooks() returns void AS $$ - DROP EVENT TRIGGER IF EXISTS cdb_on_relation_create; - DROP EVENT TRIGGER IF EXISTS cdb_on_relation_drop; - DROP EVENT TRIGGER IF EXISTS cdb_on_alter_column; - DROP EVENT TRIGGER IF EXISTS cdb_on_drop_column; - DROP EVENT TRIGGER IF EXISTS cdb_on_add_column; -$$ LANGUAGE sql; - -CREATE OR REPLACE FUNCTION cartodb.cdb_enable_ddl_hooks() returns void AS $$ - SELECT cartodb.cdb_disable_ddl_hooks(); - CREATE EVENT TRIGGER cdb_on_relation_create - ON "relation_create" EXECUTE PROCEDURE cartodb.cdb_handle_create_table(); - CREATE EVENT TRIGGER cdb_on_relation_drop - ON "relation_drop" EXECUTE PROCEDURE cartodb.cdb_handle_drop_table(); - CREATE EVENT TRIGGER cdb_on_alter_column - ON "column_alter" EXECUTE PROCEDURE cartodb.cdb_handle_alter_column(); - CREATE EVENT TRIGGER cdb_on_drop_column - ON "column_drop" EXECUTE PROCEDURE cartodb.cdb_handle_drop_column(); - CREATE EVENT TRIGGER cdb_on_add_column - ON "column_add" EXECUTE PROCEDURE cartodb.cdb_handle_add_column(); -$$ LANGUAGE sql; - --- Do not enable hooks by default ---SELECT cartodb.cdb_enable_ddl_hooks(); diff --git a/sql/test_setup.sql b/sql/test_setup.sql index 67fe684..cb4d895 100644 --- a/sql/test_setup.sql +++ b/sql/test_setup.sql @@ -1,5 +1,4 @@ CREATE EXTENSION postgis; -CREATE EXTENSION schema_triggers; CREATE EXTENSION plpythonu; CREATE EXTENSION cartodb; CREATE FUNCTION public.cdb_invalidate_varnish(table_name text) @@ -7,4 +6,4 @@ RETURNS void AS $$ BEGIN RAISE NOTICE 'cdb_invalidate_varnish(%) called', table_name; END; -$$ LANGUAGE 'plpgsql'; \ No newline at end of file +$$ LANGUAGE 'plpgsql';