[{"data":1,"prerenderedAt":1701},["ShallowReactive",2],{"navigation":3,"\u002Fdata-api\u002Ftransactions":773,"\u002Fdata-api\u002Ftransactions-surround":1696},[4,28,63,85,103,112,269,355,453,485,506,542,576,594,647,669,693,721,747],{"title":5,"path":6,"stem":7,"children":8,"icon":27},"Getting Started","\u002Fgetting-started","01.getting-started\u002F01.index",[9,11,15,19,23],{"title":10,"path":6,"stem":7},"Introduction",{"title":12,"path":13,"stem":14},"Installation","\u002Fgetting-started\u002Finstallation","01.getting-started\u002F02.installation",{"title":16,"path":17,"stem":18},"Quickstart with AI","\u002Fgetting-started\u002Fquickstart-with-ai","01.getting-started\u002F03.quickstart-with-ai",{"title":20,"path":21,"stem":22},"Quickstart by Hand","\u002Fgetting-started\u002Fquickstart-by-hand","01.getting-started\u002F04.quickstart-by-hand",{"title":24,"path":25,"stem":26},"The Admin","\u002Fgetting-started\u002Fadmin-tour","01.getting-started\u002F05.admin-tour","i-lucide-rocket",{"title":29,"icon":30,"path":31,"stem":32,"children":33,"page":62},"Concepts","i-lucide-lightbulb","\u002Fconcepts","02.concepts",[34,38,42,46,50,54,58],{"title":35,"path":36,"stem":37},"PostgreSQL First","\u002Fconcepts\u002Fpostgresql-first","02.concepts\u002F01.postgresql-first",{"title":39,"path":40,"stem":41},"Resources","\u002Fconcepts\u002Fresources","02.concepts\u002F02.resources",{"title":43,"path":44,"stem":45},"Users and Roles","\u002Fconcepts\u002Fusers-and-roles","02.concepts\u002F03.users-and-roles",{"title":47,"path":48,"stem":49},"Permissions","\u002Fconcepts\u002Fpermissions","02.concepts\u002F04.permissions",{"title":51,"path":52,"stem":53},"Drafts and Publishing","\u002Fconcepts\u002Fdrafts-and-publishing","02.concepts\u002F05.drafts-and-publishing",{"title":55,"path":56,"stem":57},"Audit and Events","\u002Fconcepts\u002Faudit-and-events","02.concepts\u002F06.audit-and-events",{"title":59,"path":60,"stem":61},"Object Access","\u002Fconcepts\u002Fobject-access","02.concepts\u002F07.object-access",false,{"title":64,"icon":65,"path":66,"stem":67,"children":68,"page":62},"App","i-lucide-app-window","\u002Fapp","03.app",[69,73,77,81],{"title":70,"path":71,"stem":72},"The App","\u002Fapp\u002Foverview","03.app\u002F01.overview",{"title":74,"path":75,"stem":76},"DataViews","\u002Fapp\u002Fdataviews","03.app\u002F02.dataviews",{"title":78,"path":79,"stem":80},"Dashboards","\u002Fapp\u002Fdashboards","03.app\u002F03.dashboards",{"title":82,"path":83,"stem":84},"Arrange menu","\u002Fapp\u002Farrange-menu","03.app\u002F04.arrange-menu",{"title":86,"icon":87,"path":88,"stem":89,"children":90,"page":62},"Database","i-lucide-database","\u002Fdatabase","04.database",[91,95,99],{"title":92,"path":93,"stem":94},"Tables","\u002Fdatabase\u002Ftables","04.database\u002F01.tables",{"title":96,"path":97,"stem":98},"Views","\u002Fdatabase\u002Fviews","04.database\u002F02.views",{"title":100,"path":101,"stem":102},"Functions","\u002Fdatabase\u002Ffunctions","04.database\u002F03.functions",{"title":104,"icon":105,"path":106,"stem":107,"children":108,"page":62},"SQL Console","i-lucide-square-terminal","\u002Fsql-console","05.sql-console",[109],{"title":104,"path":110,"stem":111},"\u002Fsql-console\u002Foverview","05.sql-console\u002F01.overview",{"title":74,"icon":113,"path":114,"stem":115,"children":116,"page":62},"i-lucide-layout-list","\u002Fdataviews","06.dataviews",[117,121,125,129,183,214],{"title":118,"path":119,"stem":120},"Overview","\u002Fdataviews\u002Foverview","06.dataviews\u002F01.overview",{"title":122,"path":123,"stem":124},"Creating a DataView","\u002Fdataviews\u002Fcreating","06.dataviews\u002F02.creating",{"title":126,"path":127,"stem":128},"Publishing","\u002Fdataviews\u002Fpublishing","06.dataviews\u002F03.publishing",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":62},"Types","i-lucide-shapes","\u002Fdataviews\u002Ftypes","06.dataviews\u002F04.types",[135,139,143,147,151,155,159,163,167,171,175,179],{"title":136,"path":137,"stem":138},"Table","\u002Fdataviews\u002Ftypes\u002Ftable","06.dataviews\u002F04.types\u002F01.table",{"title":140,"path":141,"stem":142},"Cards","\u002Fdataviews\u002Ftypes\u002Fcards","06.dataviews\u002F04.types\u002F02.cards",{"title":144,"path":145,"stem":146},"Kanban","\u002Fdataviews\u002Ftypes\u002Fkanban","06.dataviews\u002F04.types\u002F03.kanban",{"title":148,"path":149,"stem":150},"Calendar","\u002Fdataviews\u002Ftypes\u002Fcalendar","06.dataviews\u002F04.types\u002F04.calendar",{"title":152,"path":153,"stem":154},"Gantt","\u002Fdataviews\u002Ftypes\u002Fgantt","06.dataviews\u002F04.types\u002F05.gantt",{"title":156,"path":157,"stem":158},"Map","\u002Fdataviews\u002Ftypes\u002Fmap","06.dataviews\u002F04.types\u002F06.map",{"title":160,"path":161,"stem":162},"Tree","\u002Fdataviews\u002Ftypes\u002Ftree","06.dataviews\u002F04.types\u002F07.tree",{"title":164,"path":165,"stem":166},"Form","\u002Fdataviews\u002Ftypes\u002Fform","06.dataviews\u002F04.types\u002F08.form",{"title":168,"path":169,"stem":170},"Master-detail","\u002Fdataviews\u002Ftypes\u002Fmaster-detail","06.dataviews\u002F04.types\u002F09.master-detail",{"title":172,"path":173,"stem":174},"Settings","\u002Fdataviews\u002Ftypes\u002Fsettings","06.dataviews\u002F04.types\u002F10.settings",{"title":176,"path":177,"stem":178},"Custom","\u002Fdataviews\u002Ftypes\u002Fcustom","06.dataviews\u002F04.types\u002F11.custom",{"title":180,"path":181,"stem":182},"External Frame","\u002Fdataviews\u002Ftypes\u002Fexternal-frame","06.dataviews\u002F04.types\u002F12.external-frame",{"title":172,"icon":184,"path":185,"stem":186,"children":187,"page":62},"i-lucide-settings-2","\u002Fdataviews\u002Fsettings","06.dataviews\u002F05.settings",[188,192,196,199,202,206,210],{"title":189,"path":190,"stem":191},"General","\u002Fdataviews\u002Fsettings\u002Fgeneral","06.dataviews\u002F05.settings\u002F01.general",{"title":193,"path":194,"stem":195},"Data","\u002Fdataviews\u002Fsettings\u002Fdata","06.dataviews\u002F05.settings\u002F02.data",{"title":96,"path":197,"stem":198},"\u002Fdataviews\u002Fsettings\u002Fviews","06.dataviews\u002F05.settings\u002F03.views",{"title":164,"path":200,"stem":201},"\u002Fdataviews\u002Fsettings\u002Fform","06.dataviews\u002F05.settings\u002F04.form",{"title":203,"path":204,"stem":205},"Actions","\u002Fdataviews\u002Fsettings\u002Factions","06.dataviews\u002F05.settings\u002F05.actions",{"title":207,"path":208,"stem":209},"Security","\u002Fdataviews\u002Fsettings\u002Fsecurity","06.dataviews\u002F05.settings\u002F06.security",{"title":211,"path":212,"stem":213},"Versions","\u002Fdataviews\u002Fsettings\u002Fversions","06.dataviews\u002F05.settings\u002F07.versions",{"title":215,"icon":216,"path":217,"stem":218,"children":219,"page":62},"Design Form","i-lucide-pencil-ruler","\u002Fdataviews\u002Fdesign-form","06.dataviews\u002F06.design-form",[220,223,257,261,265],{"title":118,"path":221,"stem":222},"\u002Fdataviews\u002Fdesign-form\u002Foverview","06.dataviews\u002F06.design-form\u002F01.overview",{"title":224,"icon":131,"path":225,"stem":226,"children":227,"page":62},"Widgets","\u002Fdataviews\u002Fdesign-form\u002Fwidgets","06.dataviews\u002F06.design-form\u002F02.widgets",[228,231,234,238,242,246,250,254],{"title":224,"path":229,"stem":230},"\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Foverview","06.dataviews\u002F06.design-form\u002F02.widgets\u002F01.overview",{"title":164,"path":232,"stem":233},"\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Fform","06.dataviews\u002F06.design-form\u002F02.widgets\u002F02.form",{"title":235,"path":236,"stem":237},"Inputs","\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Finputs","06.dataviews\u002F06.design-form\u002F02.widgets\u002F03.inputs",{"title":239,"path":240,"stem":241},"Display","\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Fdisplay","06.dataviews\u002F06.design-form\u002F02.widgets\u002F04.display",{"title":243,"path":244,"stem":245},"Embeds","\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Fembeds","06.dataviews\u002F06.design-form\u002F02.widgets\u002F05.embeds",{"title":247,"path":248,"stem":249},"Layout","\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Flayout","06.dataviews\u002F06.design-form\u002F02.widgets\u002F06.layout",{"title":251,"path":252,"stem":253},"Overlays","\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Foverlays","06.dataviews\u002F06.design-form\u002F02.widgets\u002F07.overlays",{"title":203,"path":255,"stem":256},"\u002Fdataviews\u002Fdesign-form\u002Fwidgets\u002Factions","06.dataviews\u002F06.design-form\u002F02.widgets\u002F08.actions",{"title":258,"path":259,"stem":260},"Variables","\u002Fdataviews\u002Fdesign-form\u002Fvariables","06.dataviews\u002F06.design-form\u002F03.variables",{"title":262,"path":263,"stem":264},"Code","\u002Fdataviews\u002Fdesign-form\u002Fcode","06.dataviews\u002F06.design-form\u002F04.code",{"title":266,"path":267,"stem":268},"Formulas","\u002Fdataviews\u002Fdesign-form\u002Fformulas","06.dataviews\u002F06.design-form\u002F05.formulas",{"title":78,"icon":270,"path":271,"stem":272,"children":273,"page":62},"i-lucide-layout-dashboard","\u002Fdashboards","07.dashboards",[274,277,281,285,332],{"title":118,"path":275,"stem":276},"\u002Fdashboards\u002Foverview","07.dashboards\u002F01.overview",{"title":278,"path":279,"stem":280},"Creating a Dashboard","\u002Fdashboards\u002Fcreating","07.dashboards\u002F02.creating",{"title":282,"path":283,"stem":284},"Editor","\u002Fdashboards\u002Feditor","07.dashboards\u002F03.editor",{"title":224,"icon":286,"path":287,"stem":288,"children":289,"page":62},"i-lucide-chart-bar","\u002Fdashboards\u002Fwidgets","07.dashboards\u002F04.widgets",[290,293,297,301,305,309,313,317,321,324,328],{"title":224,"path":291,"stem":292},"\u002Fdashboards\u002Fwidgets\u002Foverview","07.dashboards\u002F04.widgets\u002F01.overview",{"title":294,"path":295,"stem":296},"Editing a Widget","\u002Fdashboards\u002Fwidgets\u002Fediting-a-widget","07.dashboards\u002F04.widgets\u002F02.editing-a-widget",{"title":298,"path":299,"stem":300},"Indicators","\u002Fdashboards\u002Fwidgets\u002Findicators","07.dashboards\u002F04.widgets\u002F03.indicators",{"title":302,"path":303,"stem":304},"Comparison","\u002Fdashboards\u002Fwidgets\u002Fcomparison","07.dashboards\u002F04.widgets\u002F04.comparison",{"title":306,"path":307,"stem":308},"Trend","\u002Fdashboards\u002Fwidgets\u002Ftrend","07.dashboards\u002F04.widgets\u002F05.trend",{"title":310,"path":311,"stem":312},"Proportion","\u002Fdashboards\u002Fwidgets\u002Fproportion","07.dashboards\u002F04.widgets\u002F06.proportion",{"title":314,"path":315,"stem":316},"Distribution and Relation","\u002Fdashboards\u002Fwidgets\u002Fdistribution-and-relation","07.dashboards\u002F04.widgets\u002F07.distribution-and-relation",{"title":318,"path":319,"stem":320},"Maps","\u002Fdashboards\u002Fwidgets\u002Fmaps","07.dashboards\u002F04.widgets\u002F08.maps",{"title":92,"path":322,"stem":323},"\u002Fdashboards\u002Fwidgets\u002Ftables","07.dashboards\u002F04.widgets\u002F09.tables",{"title":325,"path":326,"stem":327},"Visualization and Insertion","\u002Fdashboards\u002Fwidgets\u002Fvisualization-and-insertion","07.dashboards\u002F04.widgets\u002F10.visualization-and-insertion",{"title":329,"path":330,"stem":331},"SQL Conventions","\u002Fdashboards\u002Fwidgets\u002Fsql-conventions","07.dashboards\u002F04.widgets\u002F11.sql-conventions",{"title":172,"icon":184,"path":333,"stem":334,"children":335,"page":62},"\u002Fdashboards\u002Fsettings","07.dashboards\u002F05.settings",[336,339,342,345,349,352],{"title":189,"path":337,"stem":338},"\u002Fdashboards\u002Fsettings\u002Fgeneral","07.dashboards\u002F05.settings\u002F01.general",{"title":258,"path":340,"stem":341},"\u002Fdashboards\u002Fsettings\u002Fvariables","07.dashboards\u002F05.settings\u002F02.variables",{"title":193,"path":343,"stem":344},"\u002Fdashboards\u002Fsettings\u002Fdata","07.dashboards\u002F05.settings\u002F03.data",{"title":346,"path":347,"stem":348},"Share","\u002Fdashboards\u002Fsettings\u002Fshare","07.dashboards\u002F05.settings\u002F04.share",{"title":207,"path":350,"stem":351},"\u002Fdashboards\u002Fsettings\u002Fsecurity","07.dashboards\u002F05.settings\u002F05.security",{"title":211,"path":353,"stem":354},"\u002Fdashboards\u002Fsettings\u002Fversions","07.dashboards\u002F05.settings\u002F06.versions",{"title":356,"icon":357,"path":358,"stem":359,"children":360,"page":62},"Workflows","i-lucide-workflow","\u002Fworkflows","08.workflows",[361,364,368,371,393,432],{"title":118,"path":362,"stem":363},"\u002Fworkflows\u002Foverview","08.workflows\u002F01.overview",{"title":365,"path":366,"stem":367},"Creating a Workflow","\u002Fworkflows\u002Fcreating","08.workflows\u002F02.creating",{"title":282,"path":369,"stem":370},"\u002Fworkflows\u002Feditor","08.workflows\u002F03.editor",{"title":372,"icon":373,"path":374,"stem":375,"children":376,"page":62},"Triggers","i-lucide-zap","\u002Fworkflows\u002Ftriggers","08.workflows\u002F04.triggers",[377,381,385,389],{"title":378,"path":379,"stem":380},"Manual","\u002Fworkflows\u002Ftriggers\u002Fmanual","08.workflows\u002F04.triggers\u002F01.manual",{"title":382,"path":383,"stem":384},"Database Event","\u002Fworkflows\u002Ftriggers\u002Fdatabase-event","08.workflows\u002F04.triggers\u002F02.database-event",{"title":386,"path":387,"stem":388},"Schedule","\u002Fworkflows\u002Ftriggers\u002Fschedule","08.workflows\u002F04.triggers\u002F03.schedule",{"title":390,"path":391,"stem":392},"Webhook","\u002Fworkflows\u002Ftriggers\u002Fwebhook","08.workflows\u002F04.triggers\u002F04.webhook",{"title":394,"icon":357,"path":395,"stem":396,"children":397,"page":62},"Steps","\u002Fworkflows\u002Fsteps","08.workflows\u002F05.steps",[398,401,405,408,412,416,420,424,428],{"title":193,"path":399,"stem":400},"\u002Fworkflows\u002Fsteps\u002Fdata","08.workflows\u002F05.steps\u002F01.data",{"title":402,"path":403,"stem":404},"Control","\u002Fworkflows\u002Fsteps\u002Fcontrol","08.workflows\u002F05.steps\u002F02.control",{"title":262,"path":406,"stem":407},"\u002Fworkflows\u002Fsteps\u002Fcode","08.workflows\u002F05.steps\u002F03.code",{"title":409,"path":410,"stem":411},"Integration","\u002Fworkflows\u002Fsteps\u002Fintegration","08.workflows\u002F05.steps\u002F04.integration",{"title":413,"path":414,"stem":415},"Communication","\u002Fworkflows\u002Fsteps\u002Fcommunication","08.workflows\u002F05.steps\u002F05.communication",{"title":417,"path":418,"stem":419},"Files","\u002Fworkflows\u002Fsteps\u002Ffiles","08.workflows\u002F05.steps\u002F06.files",{"title":421,"path":422,"stem":423},"Documents","\u002Fworkflows\u002Fsteps\u002Fdocuments","08.workflows\u002F05.steps\u002F07.documents",{"title":425,"path":426,"stem":427},"Composition","\u002Fworkflows\u002Fsteps\u002Fcomposition","08.workflows\u002F05.steps\u002F08.composition",{"title":429,"path":430,"stem":431},"Values","\u002Fworkflows\u002Fsteps\u002Fvalues","08.workflows\u002F05.steps\u002F09.values",{"title":172,"icon":184,"path":433,"stem":434,"children":435,"page":62},"\u002Fworkflows\u002Fsettings","08.workflows\u002F06.settings",[436,439,443,446,449],{"title":189,"path":437,"stem":438},"\u002Fworkflows\u002Fsettings\u002Fgeneral","08.workflows\u002F06.settings\u002F01.general",{"title":440,"path":441,"stem":442},"Trigger","\u002Fworkflows\u002Fsettings\u002Ftrigger","08.workflows\u002F06.settings\u002F02.trigger",{"title":207,"path":444,"stem":445},"\u002Fworkflows\u002Fsettings\u002Fsecurity","08.workflows\u002F06.settings\u002F03.security",{"title":211,"path":447,"stem":448},"\u002Fworkflows\u002Fsettings\u002Fversions","08.workflows\u002F06.settings\u002F04.versions",{"title":450,"path":451,"stem":452},"Runs","\u002Fworkflows\u002Fsettings\u002Fruns","08.workflows\u002F06.settings\u002F05.runs",{"title":417,"icon":454,"path":455,"stem":456,"children":457,"page":62},"i-lucide-files","\u002Ffiles","09.files",[458,461,465,469,473,477,481],{"title":118,"path":459,"stem":460},"\u002Ffiles\u002Foverview","09.files\u002F01.overview",{"title":462,"path":463,"stem":464},"Uploading","\u002Ffiles\u002Fuploading","09.files\u002F02.uploading",{"title":466,"path":467,"stem":468},"File Details","\u002Ffiles\u002Ffile-details","09.files\u002F03.file-details",{"title":470,"path":471,"stem":472},"Editing Files","\u002Ffiles\u002Fediting-files","09.files\u002F04.editing-files",{"title":474,"path":475,"stem":476},"Using Files in Tables","\u002Ffiles\u002Fusing-files-in-tables","09.files\u002F05.using-files-in-tables",{"title":478,"path":479,"stem":480},"Image Transformations","\u002Ffiles\u002Fimage-transformations","09.files\u002F06.image-transformations",{"title":482,"path":483,"stem":484},"Who Can See a File","\u002Ffiles\u002Fwho-can-see-a-file","09.files\u002F07.who-can-see-a-file",{"title":486,"icon":487,"path":488,"stem":489,"children":490,"page":62},"Templates","i-lucide-file-text","\u002Ftemplates","10.templates",[491,494,498,502],{"title":118,"path":492,"stem":493},"\u002Ftemplates\u002Foverview","10.templates\u002F01.overview",{"title":495,"path":496,"stem":497},"Emails","\u002Ftemplates\u002Femails","10.templates\u002F02.emails",{"title":499,"path":500,"stem":501},"PDF","\u002Ftemplates\u002Fpdf","10.templates\u002F03.pdf",{"title":503,"path":504,"stem":505},"System Emails","\u002Ftemplates\u002Fsystem-emails","10.templates\u002F04.system-emails",{"title":507,"icon":508,"path":509,"stem":510,"children":511,"page":62},"Users","i-lucide-users","\u002Fusers","11.users",[512,516,520,524,528],{"title":513,"path":514,"stem":515},"Managing Users","\u002Fusers\u002Fmanaging-users","11.users\u002F01.managing-users",{"title":517,"path":518,"stem":519},"A User's Page","\u002Fusers\u002Fa-users-page","11.users\u002F02.a-users-page",{"title":521,"path":522,"stem":523},"API Tokens","\u002Fusers\u002Fapi-tokens","11.users\u002F03.api-tokens",{"title":525,"path":526,"stem":527},"Sessions","\u002Fusers\u002Fsessions","11.users\u002F04.sessions",{"title":529,"icon":530,"path":531,"stem":532,"children":533,"page":62},"Insights","i-lucide-chart-line","\u002Fusers\u002Finsights","11.users\u002F05.insights",[534,538],{"title":535,"path":536,"stem":537},"Sign-ins","\u002Fusers\u002Finsights\u002Fsign-ins","11.users\u002F05.insights\u002F01.sign-ins",{"title":539,"path":540,"stem":541},"Activity","\u002Fusers\u002Finsights\u002Factivity","11.users\u002F05.insights\u002F02.activity",{"title":543,"icon":544,"path":545,"stem":546,"children":547,"page":62},"Roles","i-lucide-shield-check","\u002Froles","12.roles",[548,552,556,560,564,568,572],{"title":549,"path":550,"stem":551},"Creating a Role","\u002Froles\u002Fcreating-a-role","12.roles\u002F01.creating-a-role",{"title":553,"path":554,"stem":555},"Granting Permissions","\u002Froles\u002Fgranting-permissions","12.roles\u002F02.granting-permissions",{"title":557,"path":558,"stem":559},"Row Filters","\u002Froles\u002Frow-filters","12.roles\u002F03.row-filters",{"title":561,"path":562,"stem":563},"Payload Checks","\u002Froles\u002Fpayload-checks","12.roles\u002F04.payload-checks",{"title":565,"path":566,"stem":567},"Members","\u002Froles\u002Fmembers","12.roles\u002F05.members",{"title":569,"path":570,"stem":571},"Access Reviews","\u002Froles\u002Faccess-reviews","12.roles\u002F06.access-reviews",{"title":573,"path":574,"stem":575},"Delegated Administration","\u002Froles\u002Fdelegated-administration","12.roles\u002F07.delegated-administration",{"title":577,"icon":578,"path":579,"stem":580,"children":581,"page":62},"Logs","i-lucide-scroll-text","\u002Flogs","13.logs",[582,586,590],{"title":583,"path":584,"stem":585},"Audit Log","\u002Flogs\u002Faudit-log","13.logs\u002F01.audit-log",{"title":587,"path":588,"stem":589},"An Entry","\u002Flogs\u002Fan-entry","13.logs\u002F02.an-entry",{"title":591,"path":592,"stem":593},"Where Else It Shows","\u002Flogs\u002Fwhere-else-it-shows","13.logs\u002F03.where-else-it-shows",{"title":595,"icon":596,"path":597,"stem":598,"children":599,"page":62},"Data API","i-lucide-braces","\u002Fdata-api","14.data-api",[600,603,607,611,615,619,623,627,631,635,639,643],{"title":118,"path":601,"stem":602},"\u002Fdata-api\u002Foverview","14.data-api\u002F01.overview",{"title":604,"path":605,"stem":606},"Authentication","\u002Fdata-api\u002Fauthentication","14.data-api\u002F02.authentication",{"title":608,"path":609,"stem":610},"Reading","\u002Fdata-api\u002Freading","14.data-api\u002F03.reading",{"title":612,"path":613,"stem":614},"Filtering","\u002Fdata-api\u002Ffiltering","14.data-api\u002F04.filtering",{"title":616,"path":617,"stem":618},"Aggregating","\u002Fdata-api\u002Faggregating","14.data-api\u002F05.aggregating",{"title":620,"path":621,"stem":622},"Writing","\u002Fdata-api\u002Fwriting","14.data-api\u002F06.writing",{"title":624,"path":625,"stem":626},"Nested Writes","\u002Fdata-api\u002Fnested-writes","14.data-api\u002F07.nested-writes",{"title":628,"path":629,"stem":630},"Transactions","\u002Fdata-api\u002Ftransactions","14.data-api\u002F08.transactions",{"title":632,"path":633,"stem":634},"Calling Functions","\u002Fdata-api\u002Fcalling-functions","14.data-api\u002F09.calling-functions",{"title":636,"path":637,"stem":638},"OpenAPI","\u002Fdata-api\u002Fopenapi","14.data-api\u002F10.openapi",{"title":640,"path":641,"stem":642},"Routes","\u002Fdata-api\u002Froutes","14.data-api\u002F11.routes",{"title":644,"path":645,"stem":646},"A client, end to end","\u002Fdata-api\u002Fa-client","14.data-api\u002F12.a-client",{"title":172,"icon":648,"path":649,"stem":650,"children":651,"page":62},"i-lucide-settings","\u002Fsettings","15.settings",[652,655,659,662,665],{"title":189,"path":653,"stem":654},"\u002Fsettings\u002Fgeneral","15.settings\u002F01.general",{"title":656,"path":657,"stem":658},"Access","\u002Fsettings\u002Faccess","15.settings\u002F02.access",{"title":207,"path":660,"stem":661},"\u002Fsettings\u002Fsecurity","15.settings\u002F03.security",{"title":595,"path":663,"stem":664},"\u002Fsettings\u002Fdata-api","15.settings\u002F04.data-api",{"title":666,"path":667,"stem":668},"Features","\u002Fsettings\u002Ffeatures","15.settings\u002F05.features",{"title":670,"icon":671,"path":672,"stem":673,"children":674,"page":62},"User Profile","i-lucide-circle-user","\u002Fuser-profile","16.user-profile",[675,679,682,686,690],{"title":676,"path":677,"stem":678},"My Account","\u002Fuser-profile\u002Fmy-account","16.user-profile\u002F01.my-account",{"title":525,"path":680,"stem":681},"\u002Fuser-profile\u002Fsessions","16.user-profile\u002F02.sessions",{"title":683,"path":684,"stem":685},"Tokens","\u002Fuser-profile\u002Ftokens","16.user-profile\u002F03.tokens",{"title":687,"path":688,"stem":689},"Preferences","\u002Fuser-profile\u002Fpreferences","16.user-profile\u002F04.preferences",{"title":539,"path":691,"stem":692},"\u002Fuser-profile\u002Factivity","16.user-profile\u002F05.activity",{"title":694,"icon":695,"path":696,"stem":697,"children":698,"page":62},"AI Agents","i-lucide-bot","\u002Fai-agents","17.ai-agents",[699,702,705,709,713,717],{"title":118,"path":700,"stem":701},"\u002Fai-agents\u002Foverview","17.ai-agents\u002F01.overview",{"title":683,"path":703,"stem":704},"\u002Fai-agents\u002Ftokens","17.ai-agents\u002F02.tokens",{"title":706,"path":707,"stem":708},"MCP Server","\u002Fai-agents\u002Fmcp-server","17.ai-agents\u002F03.mcp-server",{"title":710,"path":711,"stem":712},"Recipes","\u002Fai-agents\u002Frecipes","17.ai-agents\u002F04.recipes",{"title":714,"path":715,"stem":716},"Tools","\u002Fai-agents\u002Ftools","17.ai-agents\u002F05.tools",{"title":718,"path":719,"stem":720},"llms.txt","\u002Fai-agents\u002Fllms-txt","17.ai-agents\u002F06.llms-txt",{"title":722,"icon":723,"path":724,"stem":725,"children":726,"page":62},"Operations","i-lucide-server","\u002Foperations","18.operations",[727,731,735,739,743],{"title":728,"path":729,"stem":730},"Deployment","\u002Foperations\u002Fdeployment","18.operations\u002F01.deployment",{"title":732,"path":733,"stem":734},"PostgreSQL","\u002Foperations\u002Fpostgresql","18.operations\u002F02.postgresql",{"title":736,"path":737,"stem":738},"Public URL, Proxy and CORS","\u002Foperations\u002Fpublic-url-proxy-cors","18.operations\u002F03.public-url-proxy-cors",{"title":740,"path":741,"stem":742},"Backup and Restore","\u002Foperations\u002Fbackup-restore","18.operations\u002F04.backup-restore",{"title":744,"path":745,"stem":746},"Upgrading","\u002Foperations\u002Fupgrading","18.operations\u002F05.upgrading",{"title":748,"icon":749,"path":750,"stem":751,"children":752,"page":62},"Reference","i-lucide-library","\u002Freference","19.reference",[753,757,761,765,769],{"title":754,"path":755,"stem":756},"Query Language","\u002Freference\u002Fquery-language","19.reference\u002F01.query-language",{"title":758,"path":759,"stem":760},"Errors","\u002Freference\u002Ferrors","19.reference\u002F02.errors",{"title":762,"path":763,"stem":764},"Admin API","\u002Freference\u002Fadmin-api","19.reference\u002F03.admin-api",{"title":766,"path":767,"stem":768},"Authentication API","\u002Freference\u002Fauth-api","19.reference\u002F04.auth-api",{"title":770,"path":771,"stem":772},"Environment Variables","\u002Freference\u002Fenvironment","19.reference\u002F05.environment",{"id":774,"title":628,"admin":775,"body":776,"description":1691,"extension":1692,"links":775,"meta":1693,"navigation":1536,"path":629,"seo":1694,"stem":630,"__hash__":1695},"docs\u002F14.data-api\u002F08.transactions.md",null,{"type":777,"value":778,"toc":1681},"minimark",[779,787,790,891,1124,1127,1131,1213,1232,1236,1256,1259,1262,1283,1286,1291,1410,1413,1417,1471,1486,1490,1493,1497,1510,1650,1661,1665,1677],[780,781,782,786],"p",{},[783,784,785],"code",{},"POST \u002Fapi\u002Ftransactions"," runs several writes, on any tables, in one PostgreSQL transaction, in order. Either all of them commit or none do.",[780,788,789],{},"Use it when one action touches unrelated tables. When a technician closes an order: update the order, add the time entry, record the parts used, and free the van.",[791,792,797],"pre",{"className":793,"code":794,"language":795,"meta":796,"style":796},"language-http shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","POST \u002Fapi\u002Ftransactions\n{\n  \"operations\": [\n    { \"key\": \"order\", \"operation\": \"update\", \"schema\": \"public\", \"table\": \"work_orders\",\n      \"id\": \"8f1c…\", \"data\": { \"status\": \"COMPLETED\", \"resolution\": \"Replaced the run capacitor.\",\n                               \"customer_signature\": \"f5d2…\" } },\n    { \"key\": \"time\", \"operation\": \"insert\", \"schema\": \"public\", \"table\": \"time_entries\",\n      \"data\": { \"work_order\": \"$order.id\", \"technician\": \"e21a…\",\n                \"started_at\": \"2026-10-14T09:00:00Z\", \"ended_at\": \"2026-10-14T11:30:00Z\" } },\n    { \"key\": \"part\", \"operation\": \"insert\", \"schema\": \"public\", \"table\": \"work_order_parts\",\n      \"data\": { \"work_order\": \"$order.id\", \"part\": \"a1…\", \"warehouse\": \"v3…\", \"quantity\": 1 } },\n    { \"key\": \"van\", \"operation\": \"update\", \"schema\": \"public\", \"table\": \"vehicles\",\n      \"id\": \"5b2e…\", \"data\": { \"status\": \"AVAILABLE\" } }\n  ]\n}\n","http","",[783,798,799,807,813,819,825,831,837,843,849,855,861,867,873,879,885],{"__ignoreMap":796},[800,801,804],"span",{"class":802,"line":803},"line",1,[800,805,806],{},"POST \u002Fapi\u002Ftransactions\n",[800,808,810],{"class":802,"line":809},2,[800,811,812],{},"{\n",[800,814,816],{"class":802,"line":815},3,[800,817,818],{},"  \"operations\": [\n",[800,820,822],{"class":802,"line":821},4,[800,823,824],{},"    { \"key\": \"order\", \"operation\": \"update\", \"schema\": \"public\", \"table\": \"work_orders\",\n",[800,826,828],{"class":802,"line":827},5,[800,829,830],{},"      \"id\": \"8f1c…\", \"data\": { \"status\": \"COMPLETED\", \"resolution\": \"Replaced the run capacitor.\",\n",[800,832,834],{"class":802,"line":833},6,[800,835,836],{},"                               \"customer_signature\": \"f5d2…\" } },\n",[800,838,840],{"class":802,"line":839},7,[800,841,842],{},"    { \"key\": \"time\", \"operation\": \"insert\", \"schema\": \"public\", \"table\": \"time_entries\",\n",[800,844,846],{"class":802,"line":845},8,[800,847,848],{},"      \"data\": { \"work_order\": \"$order.id\", \"technician\": \"e21a…\",\n",[800,850,852],{"class":802,"line":851},9,[800,853,854],{},"                \"started_at\": \"2026-10-14T09:00:00Z\", \"ended_at\": \"2026-10-14T11:30:00Z\" } },\n",[800,856,858],{"class":802,"line":857},10,[800,859,860],{},"    { \"key\": \"part\", \"operation\": \"insert\", \"schema\": \"public\", \"table\": \"work_order_parts\",\n",[800,862,864],{"class":802,"line":863},11,[800,865,866],{},"      \"data\": { \"work_order\": \"$order.id\", \"part\": \"a1…\", \"warehouse\": \"v3…\", \"quantity\": 1 } },\n",[800,868,870],{"class":802,"line":869},12,[800,871,872],{},"    { \"key\": \"van\", \"operation\": \"update\", \"schema\": \"public\", \"table\": \"vehicles\",\n",[800,874,876],{"class":802,"line":875},13,[800,877,878],{},"      \"id\": \"5b2e…\", \"data\": { \"status\": \"AVAILABLE\" } }\n",[800,880,882],{"class":802,"line":881},14,[800,883,884],{},"  ]\n",[800,886,888],{"class":802,"line":887},15,[800,889,890],{},"}\n",[791,892,896],{"className":893,"code":894,"language":895,"meta":796,"style":796},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{ \"data\": {\n    \"order\": { \"id\": \"8f1c…\", \"status\": \"COMPLETED\", … },\n    \"time\":  { \"id\": \"…\", \"minutes\": 150, … },\n    \"part\":  { \"id\": \"…\", … },\n    \"van\":   { \"id\": \"5b2e…\", \"status\": \"AVAILABLE\", … }\n} }\n","json",[783,897,898,920,982,1031,1064,1116],{"__ignoreMap":796},[800,899,900,904,907,911,914,917],{"class":802,"line":803},[800,901,903],{"class":902},"sMK4o","{",[800,905,906],{"class":902}," \"",[800,908,910],{"class":909},"spNyl","data",[800,912,913],{"class":902},"\"",[800,915,916],{"class":902},":",[800,918,919],{"class":902}," {\n",[800,921,922,925,929,931,933,936,938,942,944,946,948,952,954,957,959,962,964,966,968,971,973,975,979],{"class":802,"line":809},[800,923,924],{"class":902},"    \"",[800,926,928],{"class":927},"sBMFI","order",[800,930,913],{"class":902},[800,932,916],{"class":902},[800,934,935],{"class":902}," {",[800,937,906],{"class":902},[800,939,941],{"class":940},"sbssI","id",[800,943,913],{"class":902},[800,945,916],{"class":902},[800,947,906],{"class":902},[800,949,951],{"class":950},"sfazB","8f1c…",[800,953,913],{"class":902},[800,955,956],{"class":902},",",[800,958,906],{"class":902},[800,960,961],{"class":940},"status",[800,963,913],{"class":902},[800,965,916],{"class":902},[800,967,906],{"class":902},[800,969,970],{"class":950},"COMPLETED",[800,972,913],{"class":902},[800,974,956],{"class":902},[800,976,978],{"class":977},"sTEyZ"," … ",[800,980,981],{"class":902},"},\n",[800,983,984,986,989,991,993,996,998,1000,1002,1004,1006,1009,1011,1013,1015,1018,1020,1022,1025,1027,1029],{"class":802,"line":815},[800,985,924],{"class":902},[800,987,988],{"class":927},"time",[800,990,913],{"class":902},[800,992,916],{"class":902},[800,994,995],{"class":902},"  {",[800,997,906],{"class":902},[800,999,941],{"class":940},[800,1001,913],{"class":902},[800,1003,916],{"class":902},[800,1005,906],{"class":902},[800,1007,1008],{"class":950},"…",[800,1010,913],{"class":902},[800,1012,956],{"class":902},[800,1014,906],{"class":902},[800,1016,1017],{"class":940},"minutes",[800,1019,913],{"class":902},[800,1021,916],{"class":902},[800,1023,1024],{"class":940}," 150",[800,1026,956],{"class":902},[800,1028,978],{"class":977},[800,1030,981],{"class":902},[800,1032,1033,1035,1038,1040,1042,1044,1046,1048,1050,1052,1054,1056,1058,1060,1062],{"class":802,"line":821},[800,1034,924],{"class":902},[800,1036,1037],{"class":927},"part",[800,1039,913],{"class":902},[800,1041,916],{"class":902},[800,1043,995],{"class":902},[800,1045,906],{"class":902},[800,1047,941],{"class":940},[800,1049,913],{"class":902},[800,1051,916],{"class":902},[800,1053,906],{"class":902},[800,1055,1008],{"class":950},[800,1057,913],{"class":902},[800,1059,956],{"class":902},[800,1061,978],{"class":977},[800,1063,981],{"class":902},[800,1065,1066,1068,1071,1073,1075,1078,1080,1082,1084,1086,1088,1091,1093,1095,1097,1099,1101,1103,1105,1108,1110,1112,1114],{"class":802,"line":827},[800,1067,924],{"class":902},[800,1069,1070],{"class":927},"van",[800,1072,913],{"class":902},[800,1074,916],{"class":902},[800,1076,1077],{"class":902},"   {",[800,1079,906],{"class":902},[800,1081,941],{"class":940},[800,1083,913],{"class":902},[800,1085,916],{"class":902},[800,1087,906],{"class":902},[800,1089,1090],{"class":950},"5b2e…",[800,1092,913],{"class":902},[800,1094,956],{"class":902},[800,1096,906],{"class":902},[800,1098,961],{"class":940},[800,1100,913],{"class":902},[800,1102,916],{"class":902},[800,1104,906],{"class":902},[800,1106,1107],{"class":950},"AVAILABLE",[800,1109,913],{"class":902},[800,1111,956],{"class":902},[800,1113,978],{"class":977},[800,1115,890],{"class":902},[800,1117,1118,1121],{"class":802,"line":833},[800,1119,1120],{"class":902},"}",[800,1122,1123],{"class":902}," }\n",[780,1125,1126],{},"If the van has no stock of that part, the stock trigger raises an error and the order isn't completed either.",[1128,1129,722],"h2",{"id":1130},"operations",[1132,1133,1134,1152],"table",{},[1135,1136,1137],"thead",{},[1138,1139,1140,1146,1149],"tr",{},[1141,1142,1143],"th",{},[783,1144,1145],{},"operation",[1141,1147,1148],{},"Needs",[1141,1150,1151],{},"Does",[1153,1154,1155,1182,1199],"tbody",{},[1138,1156,1157,1163,1167],{},[1158,1159,1160],"td",{},[783,1161,1162],{},"insert",[1158,1164,1165],{},[783,1166,910],{},[1158,1168,1169,1170,1172,1173,1176,1177,1181],{},"creates a row. ",[783,1171,910],{}," may carry ",[783,1174,1175],{},"$child"," lists, a ",[1178,1179,1180],"a",{"href":625},"nested write",".",[1138,1183,1184,1189,1196],{},[1158,1185,1186],{},[783,1187,1188],{},"update",[1158,1190,1191,1193,1194],{},[783,1192,941],{},", ",[783,1195,910],{},[1158,1197,1198],{},"updates the row with that primary key",[1138,1200,1201,1206,1210],{},[1158,1202,1203],{},[783,1204,1205],{},"delete",[1158,1207,1208],{},[783,1209,941],{},[1158,1211,1212],{},"deletes the row with that primary key",[780,1214,1215,1216,1219,1220,1223,1224,1226,1227,1223,1229,1231],{},"Each operation has a ",[783,1217,1218],{},"key",", unique in the request, and names its ",[783,1221,1222],{},"schema"," and ",[783,1225,1132],{},". ",[783,1228,1188],{},[783,1230,1205],{}," need a single-column primary key.",[1128,1233,1235],{"id":1234},"references-between-operations","References between operations",[780,1237,1238,1239,1242,1243,1245,1246,1248,1249,1252,1253,1181],{},"A string ",[783,1240,1241],{},"\"$\u003Ckey>.\u003Cfield>\""," in a later operation's ",[783,1244,910],{}," or ",[783,1247,941],{}," is replaced by that field of an earlier operation's result: ",[783,1250,1251],{},"\"$order.id\""," above. References only point backwards, to operations already run. An unknown key or field is ",[783,1254,1255],{},"400 TRANSACTION_REFERENCE_NOT_FOUND",[780,1257,1258],{},"References read the result as the caller sees it. A field you can't read can't be copied this way.",[1128,1260,47],{"id":1261},"permissions",[1263,1264,1265,1277,1280],"ul",{},[1266,1267,1268,1269,1273,1274,1181],"li",{},"The caller's role needs the ",[1270,1271,1272],"strong",{},"Can run transactions"," capability (in the role's General section). Otherwise the answer is ",[783,1275,1276],{},"403 TRANSACTION_EXECUTION_DENIED",[1266,1278,1279],{},"Then each operation is checked exactly as its own route would be: the method must be exposed, and the permission, fields, row filter, payload checks and guardrails all apply. A transaction never grants more than the separate requests would.",[1266,1281,1282],{},"One refused operation fails the whole transaction.",[1128,1284,758],{"id":1285},"errors",[780,1287,1288,1289,916],{},"An error says which operation failed, with its key in ",[783,1290,1145],{},[791,1292,1294],{"className":893,"code":1293,"language":895,"meta":796,"style":796},"{ \"errors\": [ { \"source\": \"POSTGRESQL\", \"code\": \"CHECK_VIOLATION\", \"operation\": \"part\",\n                \"message\": \"Not enough stock in this warehouse.\", \"field\": \"quantity\" } ] }\n",[783,1295,1296,1365],{"__ignoreMap":796},[800,1297,1298,1300,1302,1304,1306,1308,1311,1313,1315,1318,1320,1322,1324,1327,1329,1331,1333,1335,1337,1339,1341,1344,1346,1348,1350,1352,1354,1356,1358,1360,1362],{"class":802,"line":803},[800,1299,903],{"class":902},[800,1301,906],{"class":902},[800,1303,1285],{"class":909},[800,1305,913],{"class":902},[800,1307,916],{"class":902},[800,1309,1310],{"class":902}," [",[800,1312,935],{"class":902},[800,1314,906],{"class":902},[800,1316,1317],{"class":927},"source",[800,1319,913],{"class":902},[800,1321,916],{"class":902},[800,1323,906],{"class":902},[800,1325,1326],{"class":950},"POSTGRESQL",[800,1328,913],{"class":902},[800,1330,956],{"class":902},[800,1332,906],{"class":902},[800,1334,783],{"class":927},[800,1336,913],{"class":902},[800,1338,916],{"class":902},[800,1340,906],{"class":902},[800,1342,1343],{"class":950},"CHECK_VIOLATION",[800,1345,913],{"class":902},[800,1347,956],{"class":902},[800,1349,906],{"class":902},[800,1351,1145],{"class":927},[800,1353,913],{"class":902},[800,1355,916],{"class":902},[800,1357,906],{"class":902},[800,1359,1037],{"class":950},[800,1361,913],{"class":902},[800,1363,1364],{"class":902},",\n",[800,1366,1367,1370,1373,1375,1377,1379,1382,1384,1386,1388,1391,1393,1395,1397,1400,1402,1405,1408],{"class":802,"line":809},[800,1368,1369],{"class":902},"                \"",[800,1371,1372],{"class":927},"message",[800,1374,913],{"class":902},[800,1376,916],{"class":902},[800,1378,906],{"class":902},[800,1380,1381],{"class":950},"Not enough stock in this warehouse.",[800,1383,913],{"class":902},[800,1385,956],{"class":902},[800,1387,906],{"class":902},[800,1389,1390],{"class":927},"field",[800,1392,913],{"class":902},[800,1394,916],{"class":902},[800,1396,906],{"class":902},[800,1398,1399],{"class":950},"quantity",[800,1401,913],{"class":902},[800,1403,1404],{"class":902}," }",[800,1406,1407],{"class":902}," ]",[800,1409,1123],{"class":902},[780,1411,1412],{},"A form can use it to mark the line that failed.",[1128,1414,1416],{"id":1415},"limits-and-settings","Limits and settings",[1132,1418,1419,1429],{},[1135,1420,1421],{},[1138,1422,1423,1426],{},[1141,1424,1425],{},"Setting",[1141,1427,1428],{},"Default",[1153,1430,1431,1445,1458],{},[1138,1432,1433,1438],{},[1158,1434,1435],{},[783,1436,1437],{},"transactions.enabled",[1158,1439,1440,1441,1444],{},"on (off: ",[783,1442,1443],{},"403 TRANSACTIONS_DISABLED",")",[1138,1446,1447,1452],{},[1158,1448,1449],{},[783,1450,1451],{},"transactions.max_operations",[1158,1453,1454,1455,1444],{},"20 (",[783,1456,1457],{},"400 TRANSACTION_LIMIT_EXCEEDED",[1138,1459,1460,1465],{},[1158,1461,1462],{},[783,1463,1464],{},"transactions.timeout_ms",[1158,1466,1467,1468],{},"each statement's timeout; 0 uses ",[783,1469,1470],{},"api.request_timeout_ms",[780,1472,1473,1474,1477,1478,1481,1482,1181],{},"There is no partial commit, no continue-on-error and no savepoints. A transaction accepts an ",[783,1475,1476],{},"Idempotency-Key",", so a retried request runs once. With ",[783,1479,1480],{},"Prefer: respond-async"," it's queued and runs in the background. See ",[1178,1483,1485],{"href":1484},"\u002Fdata-api\u002Fcalling-functions#asynchronous-calls","Calling functions",[1128,1487,1489],{"id":1488},"transactions-or-a-function","Transactions or a function?",[780,1491,1492],{},"When the same multi-step write always happens together and its logic belongs to the data, write a PostgreSQL function and call it. Every client then gets the same behavior, and the rules live in the database. Use transactions when the client decides which writes go together.",[1128,1494,1496],{"id":1495},"the-sql-it-runs","The SQL it runs",[780,1498,1499,1500,1502,1503,1506,1507,1181],{},"This is the SQL TotalBase sent to PostgreSQL for the example above, as PostgreSQL's own log recorded it - ids shortened, long column lists cut with ",[783,1501,1008],{},". Every value travels as a parameter (",[783,1504,1505],{},"$1","), never inside the SQL text. This one is a dispatcher's transaction, two operations: assigning an order, then a quote for its site, with ",[783,1508,1509],{},"\"site\": \"$order.site\"",[791,1511,1515],{"className":1512,"code":1513,"language":1514,"meta":796,"style":796},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","BEGIN;\nSELECT set_config('statement_timeout', '30000', true),\n       set_config('totalbase.actor_user_id', 'a26c…', true);\n\n-- order: an update. The old row is locked and checked against the role's row filter (their branch)…\nWITH old_rows AS (\n  SELECT t0.\"id\" AS __old_key_0, t0.\"status\" AS __old_4, …\n  FROM \"public\".\"work_orders\" AS t0\n  WHERE t0.\"id\" = $3 AND t0.\"branch\" = $4                     -- $3 = the order, $4 = the user's branch\n  FOR UPDATE OF t0\n), upd AS (\n  UPDATE \"public\".\"work_orders\" AS t0 SET \"status\" = $1, \"technician\" = $2\n  FROM old_rows WHERE t0.\"id\" = old_rows.__old_key_0\n  RETURNING t0.*, t0.xmin::text AS __version, old_rows.*\n)\nSELECT *, (upd.\"branch\" = $5) AS __authorized FROM upd;       -- …and the new row too\nINSERT INTO totalbase.logs (…) SELECT … FROM jsonb_array_elements($1::jsonb) …;    -- its audit entry\nINSERT INTO totalbase.outbox (…) SELECT … FROM jsonb_array_elements($1::jsonb) …;  -- its event, for webhooks and workflows\n\n-- quote: an insert. \"$order.site\" was replaced by the site the first operation returned.\nWITH ins AS (INSERT INTO \"public\".\"quotes\" (\"customer\", \"site\", \"valid_until\") VALUES ($1, $2, $3) RETURNING *)\nSELECT *, true AS __authorized FROM ins;                      -- $2 = 'e712…', the order's site\nINSERT INTO totalbase.logs (…) SELECT … FROM jsonb_array_elements($1::jsonb) …;    -- its audit entry\nINSERT INTO totalbase.outbox (…) SELECT … FROM jsonb_array_elements($1::jsonb) …;  -- its event, for webhooks and workflows\nCOMMIT;\n","sql",[783,1516,1517,1522,1527,1532,1538,1543,1548,1553,1558,1563,1568,1573,1578,1583,1588,1593,1599,1605,1611,1616,1622,1628,1634,1639,1644],{"__ignoreMap":796},[800,1518,1519],{"class":802,"line":803},[800,1520,1521],{},"BEGIN;\n",[800,1523,1524],{"class":802,"line":809},[800,1525,1526],{},"SELECT set_config('statement_timeout', '30000', true),\n",[800,1528,1529],{"class":802,"line":815},[800,1530,1531],{},"       set_config('totalbase.actor_user_id', 'a26c…', true);\n",[800,1533,1534],{"class":802,"line":821},[800,1535,1537],{"emptyLinePlaceholder":1536},true,"\n",[800,1539,1540],{"class":802,"line":827},[800,1541,1542],{},"-- order: an update. The old row is locked and checked against the role's row filter (their branch)…\n",[800,1544,1545],{"class":802,"line":833},[800,1546,1547],{},"WITH old_rows AS (\n",[800,1549,1550],{"class":802,"line":839},[800,1551,1552],{},"  SELECT t0.\"id\" AS __old_key_0, t0.\"status\" AS __old_4, …\n",[800,1554,1555],{"class":802,"line":845},[800,1556,1557],{},"  FROM \"public\".\"work_orders\" AS t0\n",[800,1559,1560],{"class":802,"line":851},[800,1561,1562],{},"  WHERE t0.\"id\" = $3 AND t0.\"branch\" = $4                     -- $3 = the order, $4 = the user's branch\n",[800,1564,1565],{"class":802,"line":857},[800,1566,1567],{},"  FOR UPDATE OF t0\n",[800,1569,1570],{"class":802,"line":863},[800,1571,1572],{},"), upd AS (\n",[800,1574,1575],{"class":802,"line":869},[800,1576,1577],{},"  UPDATE \"public\".\"work_orders\" AS t0 SET \"status\" = $1, \"technician\" = $2\n",[800,1579,1580],{"class":802,"line":875},[800,1581,1582],{},"  FROM old_rows WHERE t0.\"id\" = old_rows.__old_key_0\n",[800,1584,1585],{"class":802,"line":881},[800,1586,1587],{},"  RETURNING t0.*, t0.xmin::text AS __version, old_rows.*\n",[800,1589,1590],{"class":802,"line":887},[800,1591,1592],{},")\n",[800,1594,1596],{"class":802,"line":1595},16,[800,1597,1598],{},"SELECT *, (upd.\"branch\" = $5) AS __authorized FROM upd;       -- …and the new row too\n",[800,1600,1602],{"class":802,"line":1601},17,[800,1603,1604],{},"INSERT INTO totalbase.logs (…) SELECT … FROM jsonb_array_elements($1::jsonb) …;    -- its audit entry\n",[800,1606,1608],{"class":802,"line":1607},18,[800,1609,1610],{},"INSERT INTO totalbase.outbox (…) SELECT … FROM jsonb_array_elements($1::jsonb) …;  -- its event, for webhooks and workflows\n",[800,1612,1614],{"class":802,"line":1613},19,[800,1615,1537],{"emptyLinePlaceholder":1536},[800,1617,1619],{"class":802,"line":1618},20,[800,1620,1621],{},"-- quote: an insert. \"$order.site\" was replaced by the site the first operation returned.\n",[800,1623,1625],{"class":802,"line":1624},21,[800,1626,1627],{},"WITH ins AS (INSERT INTO \"public\".\"quotes\" (\"customer\", \"site\", \"valid_until\") VALUES ($1, $2, $3) RETURNING *)\n",[800,1629,1631],{"class":802,"line":1630},22,[800,1632,1633],{},"SELECT *, true AS __authorized FROM ins;                      -- $2 = 'e712…', the order's site\n",[800,1635,1637],{"class":802,"line":1636},23,[800,1638,1604],{},[800,1640,1642],{"class":802,"line":1641},24,[800,1643,1610],{},[800,1645,1647],{"class":802,"line":1646},25,[800,1648,1649],{},"COMMIT;\n",[780,1651,1652,1653,1656,1657,1660],{},"Each operation compiles exactly as its own route would, on the same connection, inside one ",[783,1654,1655],{},"BEGIN … COMMIT",". A false ",[783,1658,1659],{},"__authorized",", a constraint or a trigger's error stops it there and PostgreSQL rolls back everything before it.",[1128,1662,1664],{"id":1663},"next-steps","Next steps",[1263,1666,1667,1671],{},[1266,1668,1669,1181],{},[1178,1670,1485],{"href":633},[1266,1672,1673,1676],{},[1178,1674,620],{"href":1675},"\u002Fdata-api\u002Fwriting#retrying-safely-idempotency-keys",": idempotency keys.",[1678,1679,1680],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":796,"searchDepth":803,"depth":809,"links":1682},[1683,1684,1685,1686,1687,1688,1689,1690],{"id":1130,"depth":809,"text":722},{"id":1234,"depth":809,"text":1235},{"id":1261,"depth":809,"text":47},{"id":1285,"depth":809,"text":758},{"id":1415,"depth":809,"text":1416},{"id":1488,"depth":809,"text":1489},{"id":1495,"depth":809,"text":1496},{"id":1663,"depth":809,"text":1664},"Run several writes on different tables in one PostgreSQL transaction, with references between them.","md",{},{"title":628,"description":1691},"NlzaK6R6NUKQqCaoNsy2vnVPKAoZQCsppAPwLN8I9Ys",[1697,1699],{"title":624,"path":625,"stem":626,"description":1698,"children":-1},"Create a row together with its children - a quote with its items - in one request and one transaction.",{"title":632,"path":633,"stem":634,"description":1700,"children":-1},"Call PostgreSQL functions by name with named arguments, synchronously or queued in the background.",1792339953639]