66 lines
2.6 KiB
PL/PgSQL
66 lines
2.6 KiB
PL/PgSQL
-- Function that reassign the owner of a table to their ownership_role
|
|
CREATE OR REPLACE FUNCTION @extschema@.CDB_OAuthReassignTableOwnerOnCreation()
|
|
RETURNS event_trigger
|
|
AS $$
|
|
DECLARE
|
|
obj record;
|
|
owner_role text;
|
|
creator_role text;
|
|
BEGIN
|
|
FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands()
|
|
LOOP
|
|
RAISE DEBUG '% ddl object: % % % %',
|
|
tg_tag,
|
|
obj.command_tag,
|
|
obj.object_type,
|
|
obj.schema_name,
|
|
obj.object_identity;
|
|
IF obj.object_type = 'function' THEN
|
|
SELECT rolname FROM pg_proc JOIN pg_roles ON proowner = pg_roles.oid WHERE pg_proc.oid = obj.objid INTO creator_role;
|
|
ELSE
|
|
SELECT rolname FROM pg_class JOIN pg_roles ON relowner = pg_roles.oid WHERE pg_class.oid = obj.objid INTO creator_role;
|
|
END IF;
|
|
SELECT value->>'ownership_role_name' from @extschema@.CDB_Conf_GetConf('api_keys_' || quote_ident(creator_role)) value INTO owner_role;
|
|
IF owner_role IS NULL OR owner_role = '' THEN
|
|
RAISE DEBUG 'owner_role not found';
|
|
CONTINUE;
|
|
ELSE
|
|
EXECUTE 'ALTER ' || obj.object_type || ' ' || obj.object_identity || ' OWNER TO ' || quote_ident(owner_role);
|
|
IF obj.object_type = 'function' THEN
|
|
EXECUTE 'GRANT ALL ON FUNCTION ' || obj.object_identity || ' TO ' || QUOTE_IDENT(creator_role);
|
|
ELSE
|
|
EXECUTE 'GRANT ALL ON ' || obj.object_identity || ' TO ' || QUOTE_IDENT(creator_role);
|
|
END IF;
|
|
RAISE DEBUG 'Changing ownership from % to %', creator_role, owner_role;
|
|
END IF;
|
|
END LOOP;
|
|
END;
|
|
$$ LANGUAGE plpgsql
|
|
VOLATILE
|
|
PARALLEL UNSAFE
|
|
SECURITY DEFINER
|
|
SET search_path = pg_temp;
|
|
|
|
-- Creates the trigger on DDL events in order to reassign the owner
|
|
CREATE OR REPLACE FUNCTION @extschema@.CDB_EnableOAuthReassignTablesTrigger()
|
|
RETURNS void
|
|
AS $$
|
|
BEGIN
|
|
DROP EVENT TRIGGER IF EXISTS oauth_reassign_tables_trigger;
|
|
|
|
CREATE EVENT TRIGGER oauth_reassign_tables_trigger
|
|
ON ddl_command_end
|
|
WHEN TAG IN ('CREATE TABLE', 'CREATE TABLE AS', 'SELECT INTO', 'CREATE VIEW', 'CREATE FOREIGN TABLE', 'CREATE MATERIALIZED VIEW', 'CREATE SEQUENCE', 'CREATE FUNCTION')
|
|
EXECUTE PROCEDURE @extschema@.CDB_OAuthReassignTableOwnerOnCreation();
|
|
END;
|
|
$$ LANGUAGE plpgsql VOLATILE PARALLEL UNSAFE;
|
|
|
|
-- Deletes the trigger on DDL events in order to reassign the owner
|
|
CREATE OR REPLACE FUNCTION @extschema@.CDB_DisableOAuthReassignTablesTrigger()
|
|
RETURNS void
|
|
AS $$
|
|
BEGIN
|
|
DROP EVENT TRIGGER IF EXISTS oauth_reassign_tables_trigger;
|
|
END;
|
|
$$ LANGUAGE plpgsql VOLATILE PARALLEL UNSAFE;
|