EventTriggers.constants.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { safeSql } from '@supabase/pg-meta'
  2. export const DEFAULT_EVENT_TRIGGER_SQL = safeSql`CREATE OR REPLACE FUNCTION event_trigger_fn()
  3. RETURNS event_trigger
  4. LANGUAGE plpgsql
  5. AS $$
  6. BEGIN
  7. -- Add logic here
  8. END;
  9. $$;
  10. DROP EVENT TRIGGER IF EXISTS event_trigger_name;
  11. CREATE EVENT TRIGGER event_trigger_name
  12. ON ddl_command_end
  13. EXECUTE FUNCTION event_trigger_fn();
  14. `
  15. export const AUTO_ENABLE_RLS_EVENT_TRIGGER_SQL = safeSql`
  16. CREATE OR REPLACE FUNCTION rls_auto_enable()
  17. RETURNS EVENT_TRIGGER
  18. LANGUAGE plpgsql
  19. SECURITY DEFINER
  20. SET search_path = pg_catalog
  21. AS $$
  22. DECLARE
  23. cmd record;
  24. BEGIN
  25. FOR cmd IN
  26. SELECT *
  27. FROM pg_event_trigger_ddl_commands()
  28. WHERE command_tag IN ('CREATE TABLE', 'CREATE TABLE AS', 'SELECT INTO')
  29. AND object_type IN ('table','partitioned table')
  30. LOOP
  31. 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
  32. BEGIN
  33. EXECUTE format('alter table if exists %s enable row level security', cmd.object_identity);
  34. RAISE LOG 'rls_auto_enable: enabled RLS on %', cmd.object_identity;
  35. EXCEPTION
  36. WHEN OTHERS THEN
  37. RAISE LOG 'rls_auto_enable: failed to enable RLS on %', cmd.object_identity;
  38. END;
  39. ELSE
  40. RAISE LOG 'rls_auto_enable: skip % (either system schema or not in enforced list: %.)', cmd.object_identity, cmd.schema_name;
  41. END IF;
  42. END LOOP;
  43. END;
  44. $$;
  45. DROP EVENT TRIGGER IF EXISTS ensure_rls;
  46. CREATE EVENT TRIGGER ensure_rls
  47. ON ddl_command_end
  48. WHEN TAG IN ('CREATE TABLE', 'CREATE TABLE AS', 'SELECT INTO')
  49. EXECUTE FUNCTION rls_auto_enable();`
  50. export const EVENT_TRIGGER_TEMPLATES = [
  51. {
  52. name: 'Auto enable RLS',
  53. description: 'Enable RLS automatically on new tables in selected schemas.',
  54. content: AUTO_ENABLE_RLS_EVENT_TRIGGER_SQL,
  55. },
  56. {
  57. name: 'Prevent table drops',
  58. description: 'Block dropping tables using the sql_drop event trigger.',
  59. content: safeSql`-- Function
  60. CREATE OR REPLACE FUNCTION dont_drop_function()
  61. RETURNS event_trigger LANGUAGE plpgsql AS $$
  62. DECLARE
  63. obj record;
  64. tbl_name text;
  65. BEGIN
  66. FOR obj IN SELECT * FROM pg_event_trigger_dropped_objects()
  67. LOOP
  68. IF obj.object_type = 'table' THEN
  69. RAISE EXCEPTION 'ERROR: All tables in this schema are protected and cannot be dropped';
  70. END IF;
  71. END LOOP;
  72. END;
  73. $$;
  74. -- Event trigger
  75. CREATE EVENT TRIGGER dont_drop_trigger
  76. ON sql_drop
  77. EXECUTE FUNCTION dont_drop_function();
  78. `,
  79. },
  80. {
  81. name: 'Blank event trigger',
  82. description: 'A minimal scaffold to start from.',
  83. content: DEFAULT_EVENT_TRIGGER_SQL,
  84. },
  85. ]