TriggerList.utils.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import { ident, joinSqlFragments, keyword, safeSql, type SafeSqlFragment } from '@supabase/pg-meta'
  2. import type { DatabaseTriggersData } from '@/data/database-triggers/database-triggers-query'
  3. export type PostgresTrigger = Omit<
  4. DatabaseTriggersData[number],
  5. 'function_args' | 'condition' | 'events'
  6. > & {
  7. function_args: SafeSqlFragment[]
  8. condition: SafeSqlFragment | null
  9. events: SafeSqlFragment[]
  10. }
  11. export const generateTriggerCreateSQL = (trigger: PostgresTrigger): SafeSqlFragment => {
  12. const events = joinSqlFragments(trigger.events, ' OR ')
  13. const args =
  14. trigger.function_args.length > 0
  15. ? safeSql`(${joinSqlFragments(trigger.function_args, ', ')})`
  16. : safeSql`()`
  17. // Note: CREATE OR REPLACE is not supported for triggers
  18. // We need to drop the existing trigger first if we want to replace it
  19. let sql = safeSql`
  20. DROP TRIGGER IF EXISTS ${ident(trigger.name)} ON ${ident(trigger.schema)}.${ident(trigger.table)};
  21. CREATE TRIGGER ${ident(trigger.name)}
  22. ${keyword(trigger.activation)} ${events}
  23. ON ${ident(trigger.schema)}.${ident(trigger.table)}
  24. FOR EACH ${keyword(trigger.orientation)}
  25. `
  26. if (trigger.condition) {
  27. sql = safeSql`${sql} WHEN (${trigger.condition})\n`
  28. }
  29. sql = safeSql`${sql} EXECUTE FUNCTION ${ident(trigger.function_schema)}.${ident(trigger.function_name)}${args};`
  30. return sql
  31. }
  32. export const getDatabaseFunctionsHref = (
  33. projectRef: string | null | undefined,
  34. schema: string | null | undefined,
  35. name: string | null | undefined
  36. ): string => {
  37. return `/project/${projectRef ?? ''}/database/functions?search=${encodeURIComponent(
  38. name ?? ''
  39. )}&schema=${encodeURIComponent(schema ?? '')}`
  40. }