@pgpm/verify
Advanced tools
Sorry, the diff of this file is not supported yet
| \echo Use "CREATE EXTENSION pgpm-verify" to load this file. \quit | ||
| CREATE FUNCTION get_entity_from_str(qualified_name text) RETURNS text AS $EOFCODE$ | ||
| DECLARE | ||
| parts text[]; | ||
| BEGIN | ||
| SELECT | ||
| parse_ident(qualified_name) INTO parts; | ||
| IF cardinality(parts) > 1 THEN | ||
| RETURN parts[2]; | ||
| ELSE | ||
| RETURN parts[1]; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql STRICT; | ||
| CREATE FUNCTION get_schema_from_str(qualified_name text) RETURNS text AS $EOFCODE$ | ||
| DECLARE | ||
| parts text[]; | ||
| BEGIN | ||
| SELECT | ||
| parse_ident(qualified_name) INTO parts; | ||
| IF cardinality(parts) > 1 THEN | ||
| RETURN parts[1]; | ||
| ELSE | ||
| RETURN 'public'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql STRICT; | ||
| CREATE FUNCTION list_indexes(_table text, _index text) RETURNS TABLE ( schema_name text, table_name text, index_name text ) AS $EOFCODE$ | ||
| SELECT | ||
| n.nspname::text AS schema_name, | ||
| t.relname::text AS table_name, | ||
| i.relname::text AS index_name | ||
| FROM | ||
| pg_class t, | ||
| pg_class i, | ||
| pg_index ix, | ||
| pg_catalog.pg_namespace n | ||
| WHERE | ||
| t.oid = ix.indrelid | ||
| AND i.oid = ix.indexrelid | ||
| AND n.oid = i.relnamespace | ||
| AND n.nspname = get_schema_from_str(_table) | ||
| AND i.relname = _index | ||
| AND t.relname = get_entity_from_str(_table); | ||
| $EOFCODE$ LANGUAGE sql IMMUTABLE; | ||
| CREATE FUNCTION list_memberships(_user text) RETURNS TABLE ( rolname text ) AS $EOFCODE$ WITH RECURSIVE cte AS ( | ||
| SELECT | ||
| oid | ||
| FROM | ||
| pg_roles | ||
| WHERE | ||
| rolname = _user | ||
| UNION ALL | ||
| SELECT | ||
| m.roleid | ||
| FROM | ||
| cte | ||
| JOIN pg_auth_members m ON m.member = cte.oid | ||
| ) | ||
| SELECT | ||
| pg_roles.rolname::text AS rolname | ||
| FROM | ||
| cte c, | ||
| pg_roles | ||
| WHERE | ||
| pg_roles.oid = c.oid; | ||
| $EOFCODE$ LANGUAGE sql IMMUTABLE; | ||
| CREATE FUNCTION verify_constraint(_table text, _name text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| c.conname, | ||
| pg_get_constraintdef(c.oid) | ||
| FROM | ||
| pg_constraint c | ||
| WHERE | ||
| conname = _name | ||
| AND c.conrelid = _table::regclass) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent constraint --> %', _name | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_domain(_type text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| pg_type.typname, | ||
| n.nspname | ||
| FROM | ||
| pg_type, | ||
| pg_catalog.pg_namespace n | ||
| WHERE | ||
| typtype = 'd' | ||
| AND typname = get_entity_from_str (_type) | ||
| AND nspname = get_schema_from_str (_type)) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent type --> %', _type | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_extension(_extname text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| 1 | ||
| FROM | ||
| pg_available_extensions | ||
| WHERE | ||
| name = _extname) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent extension --> %', _extname | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_function(_name text, _user text DEFAULT NULL) RETURNS boolean AS $EOFCODE$ | ||
| DECLARE | ||
| check_user text; | ||
| BEGIN | ||
| IF (_user IS NOT NULL) THEN | ||
| check_user = _user; | ||
| ELSE | ||
| check_user = CURRENT_USER; | ||
| END IF; | ||
| IF EXISTS ( | ||
| SELECT | ||
| has_function_privilege(check_user, p.oid, 'execute') | ||
| FROM | ||
| pg_catalog.pg_proc p | ||
| JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace | ||
| WHERE | ||
| n.nspname = get_schema_from_str (_name) | ||
| AND p.proname = get_entity_from_str (_name)) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent function --> %', _name | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_index(_table text, _index text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| list_indexes (_table, _index)) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent index --> %', _index | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_membership(_user text, _role text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| 1 | ||
| FROM | ||
| list_memberships (_user) | ||
| WHERE | ||
| rolname = _role) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent member --> %', _user | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_policy(_policy text, _table text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| 1 | ||
| FROM | ||
| pg_class p | ||
| JOIN pg_catalog.pg_namespace n ON n.oid = p.relnamespace | ||
| JOIN pg_policy pol ON pol.polrelid = p.relfilenode | ||
| WHERE | ||
| pol.polname = _policy | ||
| AND relrowsecurity = 'true' | ||
| AND relname = get_entity_from_str (_table) | ||
| AND nspname = get_schema_from_str (_table)) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent policy or missing relrowsecurity --> %', _policy | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_role(_user text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| 1 | ||
| FROM | ||
| pg_roles | ||
| WHERE | ||
| rolname = _user) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent user --> %', _user | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_schema(_schema text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| * | ||
| FROM | ||
| pg_catalog.pg_namespace | ||
| WHERE | ||
| nspname = _schema) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent schema --> %', _schema | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_security(_table text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| n.oid, | ||
| relname, | ||
| n.nspname | ||
| FROM | ||
| pg_class p | ||
| JOIN pg_catalog.pg_namespace n ON n.oid = p.relnamespace | ||
| WHERE | ||
| relrowsecurity = 'true' | ||
| AND relname = get_entity_from_str (_table) | ||
| AND nspname = get_schema_from_str (_table)) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent security --> %', _name | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_table_grant(_table text, _privilege text, _role text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| grantee, | ||
| privilege_type | ||
| FROM | ||
| information_schema.role_table_grants | ||
| WHERE | ||
| table_schema = get_schema_from_str (_table) | ||
| AND table_name = get_entity_from_str (_table) | ||
| AND privilege_type = _privilege | ||
| AND grantee = _role) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent table grant --> %', _privilege | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_table(_table text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| * | ||
| FROM | ||
| information_schema.tables | ||
| WHERE | ||
| table_schema = get_schema_from_str (_table) | ||
| AND table_name = get_entity_from_str (_table)) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent table --> %', _table | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_trigger(_trigger text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| pg_trigger.tgname, | ||
| n.nspname | ||
| FROM | ||
| pg_trigger, | ||
| pg_catalog.pg_namespace n | ||
| WHERE | ||
| tgname = get_entity_from_str (_trigger) | ||
| AND nspname = get_schema_from_str (_trigger)) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent trigger --> %', _trigger | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_type(_type text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| pg_type.typname, | ||
| n.nspname | ||
| FROM | ||
| pg_type, | ||
| pg_catalog.pg_namespace n | ||
| WHERE | ||
| typname = get_entity_from_str (_type) | ||
| AND nspname = get_schema_from_str (_type)) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent type --> %', _type | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_view(_view text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| * | ||
| FROM | ||
| information_schema.views | ||
| WHERE | ||
| table_schema = get_schema_from_str (_view) | ||
| AND table_name = get_entity_from_str (_view)) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent view --> %', _view | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; |
+2
-2
@@ -1,3 +0,3 @@ | ||
| EXTENSION = launchql-verify | ||
| DATA = sql/launchql-verify--0.9.0.sql | ||
| EXTENSION = pgpm-verify | ||
| DATA = sql/pgpm-verify--0.14.0.sql | ||
@@ -4,0 +4,0 @@ PG_CONFIG = pg_config |
+2
-2
| { | ||
| "name": "@pgpm/verify", | ||
| "version": "0.14.0", | ||
| "version": "0.15.0", | ||
| "description": "Verification utilities for PGPM deploy/verify/revert workflow", | ||
@@ -34,3 +34,3 @@ "author": "Dan Lynch <pyramation@gmail.com>", | ||
| }, | ||
| "gitHead": "7369638ab084da95b0cb00ec63ad236637f6ebe5" | ||
| "gitHead": "118ac6f810720378fa954e9620abf2516293c148" | ||
| } |
@@ -1,2 +0,2 @@ | ||
| -- Revert launchql-verify:procedures/get_entity_from_str from pg | ||
| -- Revert pgpm-verify:procedures/get_entity_from_str from pg | ||
@@ -3,0 +3,0 @@ BEGIN; |
@@ -1,2 +0,2 @@ | ||
| -- Revert launchql-verify:procedures/get_schema_from_str from pg | ||
| -- Revert pgpm-verify:procedures/get_schema_from_str from pg | ||
@@ -3,0 +3,0 @@ BEGIN; |
@@ -1,2 +0,2 @@ | ||
| -- Revert launchql-verify:procedures/list_indexes from pg | ||
| -- Revert pgpm-verify:procedures/list_indexes from pg | ||
@@ -3,0 +3,0 @@ BEGIN; |
@@ -1,2 +0,2 @@ | ||
| -- Revert launchql-verify:procedures/list_memberships from pg | ||
| -- Revert pgpm-verify:procedures/list_memberships from pg | ||
@@ -3,0 +3,0 @@ BEGIN; |
@@ -1,2 +0,2 @@ | ||
| -- Verify launchql-verify:procedures/get_entity_from_str on pg | ||
| -- Verify pgpm-verify:procedures/get_entity_from_str on pg | ||
@@ -3,0 +3,0 @@ BEGIN; |
@@ -1,2 +0,2 @@ | ||
| -- Verify launchql-verify:procedures/get_schema_from_str on pg | ||
| -- Verify pgpm-verify:procedures/get_schema_from_str on pg | ||
@@ -3,0 +3,0 @@ BEGIN; |
@@ -1,2 +0,2 @@ | ||
| -- Verify launchql-verify:procedures/list_indexes on pg | ||
| -- Verify pgpm-verify:procedures/list_indexes on pg | ||
@@ -3,0 +3,0 @@ BEGIN; |
@@ -1,2 +0,2 @@ | ||
| -- Verify launchql-verify:procedures/list_memberships on pg | ||
| -- Verify pgpm-verify:procedures/list_memberships on pg | ||
@@ -3,0 +3,0 @@ BEGIN; |
Sorry, the diff of this file is not supported yet
| \echo Use "CREATE EXTENSION launchql-verify" to load this file. \quit | ||
| CREATE FUNCTION get_entity_from_str(qualified_name text) RETURNS text AS $EOFCODE$ | ||
| DECLARE | ||
| parts text[]; | ||
| BEGIN | ||
| SELECT | ||
| parse_ident(qualified_name) INTO parts; | ||
| IF cardinality(parts) > 1 THEN | ||
| RETURN parts[2]; | ||
| ELSE | ||
| RETURN parts[1]; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql STRICT; | ||
| CREATE FUNCTION get_schema_from_str(qualified_name text) RETURNS text AS $EOFCODE$ | ||
| DECLARE | ||
| parts text[]; | ||
| BEGIN | ||
| SELECT | ||
| parse_ident(qualified_name) INTO parts; | ||
| IF cardinality(parts) > 1 THEN | ||
| RETURN parts[1]; | ||
| ELSE | ||
| RETURN 'public'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql STRICT; | ||
| CREATE FUNCTION list_indexes(_table text, _index text) RETURNS TABLE ( schema_name text, table_name text, index_name text ) AS $EOFCODE$ | ||
| SELECT | ||
| n.nspname::text AS schema_name, | ||
| t.relname::text AS table_name, | ||
| i.relname::text AS index_name | ||
| FROM | ||
| pg_class t, | ||
| pg_class i, | ||
| pg_index ix, | ||
| pg_catalog.pg_namespace n | ||
| WHERE | ||
| t.oid = ix.indrelid | ||
| AND i.oid = ix.indexrelid | ||
| AND n.oid = i.relnamespace | ||
| AND n.nspname = get_schema_from_str(_table) | ||
| AND i.relname = _index | ||
| AND t.relname = get_entity_from_str(_table); | ||
| $EOFCODE$ LANGUAGE sql IMMUTABLE; | ||
| CREATE FUNCTION list_memberships(_user text) RETURNS TABLE ( rolname text ) AS $EOFCODE$ WITH RECURSIVE cte AS ( | ||
| SELECT | ||
| oid | ||
| FROM | ||
| pg_roles | ||
| WHERE | ||
| rolname = _user | ||
| UNION ALL | ||
| SELECT | ||
| m.roleid | ||
| FROM | ||
| cte | ||
| JOIN pg_auth_members m ON m.member = cte.oid | ||
| ) | ||
| SELECT | ||
| pg_roles.rolname::text AS rolname | ||
| FROM | ||
| cte c, | ||
| pg_roles | ||
| WHERE | ||
| pg_roles.oid = c.oid; | ||
| $EOFCODE$ LANGUAGE sql IMMUTABLE; | ||
| CREATE FUNCTION verify_constraint(_table text, _name text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| c.conname, | ||
| pg_get_constraintdef(c.oid) | ||
| FROM | ||
| pg_constraint c | ||
| WHERE | ||
| conname = _name | ||
| AND c.conrelid = _table::regclass) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent constraint --> %', _name | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_domain(_type text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| pg_type.typname, | ||
| n.nspname | ||
| FROM | ||
| pg_type, | ||
| pg_catalog.pg_namespace n | ||
| WHERE | ||
| typtype = 'd' | ||
| AND typname = get_entity_from_str (_type) | ||
| AND nspname = get_schema_from_str (_type)) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent type --> %', _type | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_extension(_extname text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| 1 | ||
| FROM | ||
| pg_available_extensions | ||
| WHERE | ||
| name = _extname) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent extension --> %', _extname | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_function(_name text, _user text DEFAULT NULL) RETURNS boolean AS $EOFCODE$ | ||
| DECLARE | ||
| check_user text; | ||
| BEGIN | ||
| IF (_user IS NOT NULL) THEN | ||
| check_user = _user; | ||
| ELSE | ||
| check_user = CURRENT_USER; | ||
| END IF; | ||
| IF EXISTS ( | ||
| SELECT | ||
| has_function_privilege(check_user, p.oid, 'execute') | ||
| FROM | ||
| pg_catalog.pg_proc p | ||
| JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace | ||
| WHERE | ||
| n.nspname = get_schema_from_str (_name) | ||
| AND p.proname = get_entity_from_str (_name)) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent function --> %', _name | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_index(_table text, _index text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| list_indexes (_table, _index)) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent index --> %', _index | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_membership(_user text, _role text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| 1 | ||
| FROM | ||
| list_memberships (_user) | ||
| WHERE | ||
| rolname = _role) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent member --> %', _user | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_policy(_policy text, _table text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| 1 | ||
| FROM | ||
| pg_class p | ||
| JOIN pg_catalog.pg_namespace n ON n.oid = p.relnamespace | ||
| JOIN pg_policy pol ON pol.polrelid = p.relfilenode | ||
| WHERE | ||
| pol.polname = _policy | ||
| AND relrowsecurity = 'true' | ||
| AND relname = get_entity_from_str (_table) | ||
| AND nspname = get_schema_from_str (_table)) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent policy or missing relrowsecurity --> %', _policy | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_role(_user text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| 1 | ||
| FROM | ||
| pg_roles | ||
| WHERE | ||
| rolname = _user) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent user --> %', _user | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_schema(_schema text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| * | ||
| FROM | ||
| pg_catalog.pg_namespace | ||
| WHERE | ||
| nspname = _schema) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent schema --> %', _schema | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_security(_table text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| n.oid, | ||
| relname, | ||
| n.nspname | ||
| FROM | ||
| pg_class p | ||
| JOIN pg_catalog.pg_namespace n ON n.oid = p.relnamespace | ||
| WHERE | ||
| relrowsecurity = 'true' | ||
| AND relname = get_entity_from_str (_table) | ||
| AND nspname = get_schema_from_str (_table)) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent security --> %', _name | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_table_grant(_table text, _privilege text, _role text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| grantee, | ||
| privilege_type | ||
| FROM | ||
| information_schema.role_table_grants | ||
| WHERE | ||
| table_schema = get_schema_from_str (_table) | ||
| AND table_name = get_entity_from_str (_table) | ||
| AND privilege_type = _privilege | ||
| AND grantee = _role) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent table grant --> %', _privilege | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_table(_table text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| * | ||
| FROM | ||
| information_schema.tables | ||
| WHERE | ||
| table_schema = get_schema_from_str (_table) | ||
| AND table_name = get_entity_from_str (_table)) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent table --> %', _table | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_trigger(_trigger text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| pg_trigger.tgname, | ||
| n.nspname | ||
| FROM | ||
| pg_trigger, | ||
| pg_catalog.pg_namespace n | ||
| WHERE | ||
| tgname = get_entity_from_str (_trigger) | ||
| AND nspname = get_schema_from_str (_trigger)) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent trigger --> %', _trigger | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_type(_type text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| pg_type.typname, | ||
| n.nspname | ||
| FROM | ||
| pg_type, | ||
| pg_catalog.pg_namespace n | ||
| WHERE | ||
| typname = get_entity_from_str (_type) | ||
| AND nspname = get_schema_from_str (_type)) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent type --> %', _type | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; | ||
| CREATE FUNCTION verify_view(_view text) RETURNS boolean AS $EOFCODE$ | ||
| BEGIN | ||
| IF EXISTS ( | ||
| SELECT | ||
| * | ||
| FROM | ||
| information_schema.views | ||
| WHERE | ||
| table_schema = get_schema_from_str (_view) | ||
| AND table_name = get_entity_from_str (_view)) THEN | ||
| RETURN TRUE; | ||
| ELSE | ||
| RAISE EXCEPTION 'Nonexistent view --> %', _view | ||
| USING HINT = 'Please check'; | ||
| END IF; | ||
| END; | ||
| $EOFCODE$ LANGUAGE plpgsql IMMUTABLE; |
Sorry, the diff of this file is not supported yet
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
57481
-0.12%1
Infinity%