| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- import { safeSql } from '@supabase/pg-meta'
- export const DEFAULT_EVENT_TRIGGER_SQL = safeSql`CREATE OR REPLACE FUNCTION event_trigger_fn()
- RETURNS event_trigger
- LANGUAGE plpgsql
- AS $$
- BEGIN
- -- Add logic here
- END;
- $$;
- DROP EVENT TRIGGER IF EXISTS event_trigger_name;
- CREATE EVENT TRIGGER event_trigger_name
- ON ddl_command_end
- EXECUTE FUNCTION event_trigger_fn();
- `
- export const AUTO_ENABLE_RLS_EVENT_TRIGGER_SQL = safeSql`
- CREATE OR REPLACE FUNCTION rls_auto_enable()
- RETURNS EVENT_TRIGGER
- LANGUAGE plpgsql
- SECURITY DEFINER
- SET search_path = pg_catalog
- AS $$
- DECLARE
- cmd record;
- BEGIN
- FOR cmd IN
- SELECT *
- FROM pg_event_trigger_ddl_commands()
- WHERE command_tag IN ('CREATE TABLE', 'CREATE TABLE AS', 'SELECT INTO')
- AND object_type IN ('table','partitioned table')
- LOOP
- IF cmd.schema_name IS NOT NULL AND cmd.schema_name IN ('public') AND cmd.schema_name NOT IN ('pg_catalog','information_schema') AND cmd.schema_name NOT LIKE 'pg_toast%' AND cmd.schema_name NOT LIKE 'pg_temp%' THEN
- BEGIN
- EXECUTE format('alter table if exists %s enable row level security', cmd.object_identity);
- RAISE LOG 'rls_auto_enable: enabled RLS on %', cmd.object_identity;
- EXCEPTION
- WHEN OTHERS THEN
- RAISE LOG 'rls_auto_enable: failed to enable RLS on %', cmd.object_identity;
- END;
- ELSE
- RAISE LOG 'rls_auto_enable: skip % (either system schema or not in enforced list: %.)', cmd.object_identity, cmd.schema_name;
- END IF;
- END LOOP;
- END;
- $$;
- DROP EVENT TRIGGER IF EXISTS ensure_rls;
- CREATE EVENT TRIGGER ensure_rls
- ON ddl_command_end
- WHEN TAG IN ('CREATE TABLE', 'CREATE TABLE AS', 'SELECT INTO')
- EXECUTE FUNCTION rls_auto_enable();`
- export const EVENT_TRIGGER_TEMPLATES = [
- {
- name: 'Auto enable RLS',
- description: 'Enable RLS automatically on new tables in selected schemas.',
- content: AUTO_ENABLE_RLS_EVENT_TRIGGER_SQL,
- },
- {
- name: 'Prevent table drops',
- description: 'Block dropping tables using the sql_drop event trigger.',
- content: safeSql`-- Function
- CREATE OR REPLACE FUNCTION dont_drop_function()
- RETURNS event_trigger LANGUAGE plpgsql AS $$
- DECLARE
- obj record;
- tbl_name text;
- BEGIN
- FOR obj IN SELECT * FROM pg_event_trigger_dropped_objects()
- LOOP
- IF obj.object_type = 'table' THEN
- RAISE EXCEPTION 'ERROR: All tables in this schema are protected and cannot be dropped';
- END IF;
- END LOOP;
- END;
- $$;
- -- Event trigger
- CREATE EVENT TRIGGER dont_drop_trigger
- ON sql_drop
- EXECUTE FUNCTION dont_drop_function();
- `,
- },
- {
- name: 'Blank event trigger',
- description: 'A minimal scaffold to start from.',
- content: DEFAULT_EVENT_TRIGGER_SQL,
- },
- ]
|