[{"data":1,"prerenderedAt":1647},["ShallowReactive",2],{"navigation":3,"\u002Fdata-api\u002Fnested-writes":773,"\u002Fdata-api\u002Fnested-writes-surround":1642},[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":624,"admin":775,"body":776,"description":1637,"extension":1638,"links":775,"meta":1639,"navigation":1499,"path":625,"seo":1640,"stem":626,"__hash__":1641},"docs\u002F14.data-api\u002F07.nested-writes.md",null,{"type":777,"value":778,"toc":1627},"minimark",[779,788,793,800,883,894,897,1045,1063,1067,1076,1263,1266,1270,1277,1318,1322,1329,1336,1342,1346,1401,1404,1408,1459,1463,1473,1601,1608,1612,1623],[780,781,782,783,787],"p",{},"A nested write creates a parent row and its children in one ",[784,785,786],"code",{},"POST",", such as a quote with its items or a purchase order with its lines. Everything runs in one transaction: either the whole tree is created or none of it.",[789,790,792],"h2",{"id":791},"syntax","Syntax",[780,794,795,796,799],{},"A property named ",[784,797,798],{},"$"," followed by a child table's name holds a list of child rows:",[801,802,807],"pre",{"className":803,"code":804,"language":805,"meta":806,"style":806},"language-http shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","POST \u002Fapi\u002Fpublic\u002Ftable\u002Fquotes\n{\n  \"data\": {\n    \"customer\": \"6a0f…\",\n    \"site\": \"3c9e…\",\n    \"valid_until\": \"2026-11-15\",\n    \"$quote_items\": [\n      { \"description\": \"Split unit 3000 frigorías, installed\", \"quantity\": 2, \"unit_price\": 980000 },\n      { \"description\": \"Copper line, per meter\", \"part\": \"a1…\", \"quantity\": 12, \"unit_price\": 14500, \"discount_pct\": 10 }\n    ]\n  }\n}\n","http","",[784,808,809,817,823,829,835,841,847,853,859,865,871,877],{"__ignoreMap":806},[810,811,814],"span",{"class":812,"line":813},"line",1,[810,815,816],{},"POST \u002Fapi\u002Fpublic\u002Ftable\u002Fquotes\n",[810,818,820],{"class":812,"line":819},2,[810,821,822],{},"{\n",[810,824,826],{"class":812,"line":825},3,[810,827,828],{},"  \"data\": {\n",[810,830,832],{"class":812,"line":831},4,[810,833,834],{},"    \"customer\": \"6a0f…\",\n",[810,836,838],{"class":812,"line":837},5,[810,839,840],{},"    \"site\": \"3c9e…\",\n",[810,842,844],{"class":812,"line":843},6,[810,845,846],{},"    \"valid_until\": \"2026-11-15\",\n",[810,848,850],{"class":812,"line":849},7,[810,851,852],{},"    \"$quote_items\": [\n",[810,854,856],{"class":812,"line":855},8,[810,857,858],{},"      { \"description\": \"Split unit 3000 frigorías, installed\", \"quantity\": 2, \"unit_price\": 980000 },\n",[810,860,862],{"class":812,"line":861},9,[810,863,864],{},"      { \"description\": \"Copper line, per meter\", \"part\": \"a1…\", \"quantity\": 12, \"unit_price\": 14500, \"discount_pct\": 10 }\n",[810,866,868],{"class":812,"line":867},10,[810,869,870],{},"    ]\n",[810,872,874],{"class":812,"line":873},11,[810,875,876],{},"  }\n",[810,878,880],{"class":812,"line":879},12,[810,881,882],{},"}\n",[780,884,885,886,889,890,893],{},"TotalBase inserts the quote, then each item with ",[784,887,888],{},"quote_items.quote"," set to the new quote's id. You don't send the foreign key; sending it is ",[784,891,892],{},"400 NESTED_FOREIGN_KEY_NOT_ALLOWED",".",[780,895,896],{},"Children can have children of their own, and a parent can have several child lists side by side:",[801,898,902],{"className":899,"code":900,"language":901,"meta":806,"style":806},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{ \"data\": {\n    \"supplier\": \"s7…\", \"warehouse\": \"w1…\",\n    \"$purchase_order_items\": [ { \"part\": \"a1…\", \"quantity\": 50, \"unit_cost\": 4200 } ]\n} }\n","json",[784,903,904,926,969,1037],{"__ignoreMap":806},[810,905,906,910,913,917,920,923],{"class":812,"line":813},[810,907,909],{"class":908},"sMK4o","{",[810,911,912],{"class":908}," \"",[810,914,916],{"class":915},"spNyl","data",[810,918,919],{"class":908},"\"",[810,921,922],{"class":908},":",[810,924,925],{"class":908}," {\n",[810,927,928,931,935,937,939,941,945,947,950,952,955,957,959,961,964,966],{"class":812,"line":819},[810,929,930],{"class":908},"    \"",[810,932,934],{"class":933},"sBMFI","supplier",[810,936,919],{"class":908},[810,938,922],{"class":908},[810,940,912],{"class":908},[810,942,944],{"class":943},"sfazB","s7…",[810,946,919],{"class":908},[810,948,949],{"class":908},",",[810,951,912],{"class":908},[810,953,954],{"class":933},"warehouse",[810,956,919],{"class":908},[810,958,922],{"class":908},[810,960,912],{"class":908},[810,962,963],{"class":943},"w1…",[810,965,919],{"class":908},[810,967,968],{"class":908},",\n",[810,970,971,973,976,978,980,983,986,988,992,994,996,998,1001,1003,1005,1007,1010,1012,1014,1017,1019,1021,1024,1026,1028,1031,1034],{"class":812,"line":825},[810,972,930],{"class":908},[810,974,975],{"class":933},"$purchase_order_items",[810,977,919],{"class":908},[810,979,922],{"class":908},[810,981,982],{"class":908}," [",[810,984,985],{"class":908}," {",[810,987,912],{"class":908},[810,989,991],{"class":990},"sbssI","part",[810,993,919],{"class":908},[810,995,922],{"class":908},[810,997,912],{"class":908},[810,999,1000],{"class":943},"a1…",[810,1002,919],{"class":908},[810,1004,949],{"class":908},[810,1006,912],{"class":908},[810,1008,1009],{"class":990},"quantity",[810,1011,919],{"class":908},[810,1013,922],{"class":908},[810,1015,1016],{"class":990}," 50",[810,1018,949],{"class":908},[810,1020,912],{"class":908},[810,1022,1023],{"class":990},"unit_cost",[810,1025,919],{"class":908},[810,1027,922],{"class":908},[810,1029,1030],{"class":990}," 4200",[810,1032,1033],{"class":908}," }",[810,1035,1036],{"class":908}," ]\n",[810,1038,1039,1042],{"class":812,"line":831},[810,1040,1041],{"class":908},"}",[810,1043,1044],{"class":908}," }\n",[780,1046,1047,1048,1050,1051,1054,1055,1058,1059,1062],{},"The ",[784,1049,798],{}," prefix keeps this separate from your own columns: a ",[784,1052,1053],{},"jsonb"," column named ",[784,1056,1057],{},"quote_items"," and the nested list ",[784,1060,1061],{},"$quote_items"," never collide.",[789,1064,1066],{"id":1065},"the-response","The response",[780,1068,1069,1072,1073,1075],{},[784,1070,1071],{},"201"," with the parent as stored, and each child list under its ",[784,1074,798],{}," key:",[801,1077,1079],{"className":899,"code":1078,"language":901,"meta":806,"style":806},"{ \"data\": {\n    \"id\": \"q9…\", \"customer\": \"6a0f…\", \"status\": \"DRAFT\", \"valid_until\": \"2026-11-15\",\n    \"$quote_items\": [ { \"id\": \"…\", \"quantity\": 2, … }, { \"id\": \"…\", \"quantity\": 12, … } ]\n} }\n",[784,1080,1081,1095,1169,1257],{"__ignoreMap":806},[810,1082,1083,1085,1087,1089,1091,1093],{"class":812,"line":813},[810,1084,909],{"class":908},[810,1086,912],{"class":908},[810,1088,916],{"class":915},[810,1090,919],{"class":908},[810,1092,922],{"class":908},[810,1094,925],{"class":908},[810,1096,1097,1099,1102,1104,1106,1108,1111,1113,1115,1117,1120,1122,1124,1126,1129,1131,1133,1135,1138,1140,1142,1144,1147,1149,1151,1153,1156,1158,1160,1162,1165,1167],{"class":812,"line":819},[810,1098,930],{"class":908},[810,1100,1101],{"class":933},"id",[810,1103,919],{"class":908},[810,1105,922],{"class":908},[810,1107,912],{"class":908},[810,1109,1110],{"class":943},"q9…",[810,1112,919],{"class":908},[810,1114,949],{"class":908},[810,1116,912],{"class":908},[810,1118,1119],{"class":933},"customer",[810,1121,919],{"class":908},[810,1123,922],{"class":908},[810,1125,912],{"class":908},[810,1127,1128],{"class":943},"6a0f…",[810,1130,919],{"class":908},[810,1132,949],{"class":908},[810,1134,912],{"class":908},[810,1136,1137],{"class":933},"status",[810,1139,919],{"class":908},[810,1141,922],{"class":908},[810,1143,912],{"class":908},[810,1145,1146],{"class":943},"DRAFT",[810,1148,919],{"class":908},[810,1150,949],{"class":908},[810,1152,912],{"class":908},[810,1154,1155],{"class":933},"valid_until",[810,1157,919],{"class":908},[810,1159,922],{"class":908},[810,1161,912],{"class":908},[810,1163,1164],{"class":943},"2026-11-15",[810,1166,919],{"class":908},[810,1168,968],{"class":908},[810,1170,1171,1173,1175,1177,1179,1181,1183,1185,1187,1189,1191,1193,1196,1198,1200,1202,1204,1206,1208,1211,1213,1217,1220,1222,1224,1226,1228,1230,1232,1234,1236,1238,1240,1242,1244,1246,1249,1251,1253,1255],{"class":812,"line":825},[810,1172,930],{"class":908},[810,1174,1061],{"class":933},[810,1176,919],{"class":908},[810,1178,922],{"class":908},[810,1180,982],{"class":908},[810,1182,985],{"class":908},[810,1184,912],{"class":908},[810,1186,1101],{"class":990},[810,1188,919],{"class":908},[810,1190,922],{"class":908},[810,1192,912],{"class":908},[810,1194,1195],{"class":943},"…",[810,1197,919],{"class":908},[810,1199,949],{"class":908},[810,1201,912],{"class":908},[810,1203,1009],{"class":990},[810,1205,919],{"class":908},[810,1207,922],{"class":908},[810,1209,1210],{"class":990}," 2",[810,1212,949],{"class":908},[810,1214,1216],{"class":1215},"sTEyZ"," … ",[810,1218,1219],{"class":908},"},",[810,1221,985],{"class":908},[810,1223,912],{"class":908},[810,1225,1101],{"class":990},[810,1227,919],{"class":908},[810,1229,922],{"class":908},[810,1231,912],{"class":908},[810,1233,1195],{"class":943},[810,1235,919],{"class":908},[810,1237,949],{"class":908},[810,1239,912],{"class":908},[810,1241,1009],{"class":990},[810,1243,919],{"class":908},[810,1245,922],{"class":908},[810,1247,1248],{"class":990}," 12",[810,1250,949],{"class":908},[810,1252,1216],{"class":1215},[810,1254,1041],{"class":908},[810,1256,1036],{"class":908},[810,1258,1259,1261],{"class":812,"line":831},[810,1260,1041],{"class":908},[810,1262,1044],{"class":908},[780,1264,1265],{},"The parent is read again after its children are in, so a column that a trigger updates from the children, such as a total summed from the items, is already correct in the answer.",[789,1267,1269],{"id":1268},"how-children-are-matched","How children are matched",[780,1271,1272,1273,1276],{},"For ",[784,1274,1275],{},"$child",", TotalBase needs:",[1278,1279,1280,1296],"ul",{},[1281,1282,1283,1284,1287,1288,1292,1293,1295],"li",{},"a table named ",[784,1285,1286],{},"child"," in the ",[1289,1290,1291],"strong",{},"parent's schema",", exposed with ",[784,1294,786],{},";",[1281,1297,1298,1301,1302,1305,1306,1309,1310,1313,1314,1317],{},[1289,1299,1300],{},"exactly one"," foreign key from it to the parent. With none, the answer is ",[784,1303,1304],{},"400 INVALID_NESTED_RELATION",". With two (a ",[784,1307,1308],{},"billing_customer"," and a ",[784,1311,1312],{},"shipping_customer","), it's ",[784,1315,1316],{},"400 AMBIGUOUS_NESTED_RELATION",". TotalBase never guesses.",[789,1319,1321],{"id":1320},"permissions-and-rules-apply-to-every-row","Permissions and rules apply to every row",[780,1323,1324,1325,1328],{},"Each row of the tree is a full create of its own table: its own ",[784,1326,1327],{},"CREATE"," permission and fields, row filter, payload checks, audit entry and event. Permission to create quotes doesn't imply permission to create quote items.",[780,1330,1331,1332,1335],{},"Acme's discount cap shows this. A salesperson's quote with a 25% line fails on that item, with ",[784,1333,1334],{},"422 PAYLOAD_CHECK_FAILED",", and the quote isn't created either.",[780,1337,1338,1339,893],{},"Any failure anywhere rolls back the whole tree: a permission, a constraint, a trigger, a ",[784,1340,1341],{},"RAISE EXCEPTION",[789,1343,1345],{"id":1344},"limits","Limits",[1347,1348,1349,1365],"table",{},[1350,1351,1352],"thead",{},[1353,1354,1355,1359,1362],"tr",{},[1356,1357,1358],"th",{},"Setting",[1356,1360,1361],{},"Default",[1356,1363,1364],{},"Error",[1366,1367,1368,1385],"tbody",{},[1353,1369,1370,1377,1380],{},[1371,1372,1373,1376],"td",{},[784,1374,1375],{},"api.nested_write_max_depth",": levels below the parent (1-3)",[1371,1378,1379],{},"2",[1371,1381,1382],{},[784,1383,1384],{},"NESTED_MAX_DEPTH_EXCEEDED",[1353,1386,1387,1393,1396],{},[1371,1388,1389,1392],{},[784,1390,1391],{},"api.nested_write_max_records",": rows in the whole tree",[1371,1394,1395],{},"500",[1371,1397,1398],{},[784,1399,1400],{},"NESTED_MAX_RECORDS_EXCEEDED",[780,1402,1403],{},"The whole payload is checked against the limits and relations before anything is written.",[789,1405,1407],{"id":1406},"what-nested-writes-dont-do","What nested writes don't do",[1278,1409,1410,1431,1437,1443],{},[1281,1411,1412,1415,1416,1419,1420,1422,1423,1426,1427,893],{},[1289,1413,1414],{},"Only on create."," A ",[784,1417,1418],{},"PATCH"," with a ",[784,1421,798],{}," property is refused (",[784,1424,1425],{},"400 UNSUPPORTED_NESTED_OPERATION","). Change children through their own table, or several tables in one ",[1428,1429,1430],"a",{"href":629},"transaction",[1281,1432,1433,1436],{},[1289,1434,1435],{},"No synchronization."," Children you don't send are never deleted or unlinked.",[1281,1438,1439,1442],{},[1289,1440,1441],{},"Only child tables."," A nested list follows a foreign key from the child to the parent. You can't create the parent's referenced rows (its customer) this way.",[1281,1444,1445,1455,1456,1458],{},[1289,1446,1447,1448,1451,1452,893],{},"Not with ",[784,1449,1450],{},"bulk=true"," or ",[784,1453,1454],{},"on_conflict"," A nested create inside a ",[1428,1457,1430],{"href":629}," works.",[789,1460,1462],{"id":1461},"the-sql-it-runs","The SQL it runs",[780,1464,1465,1466,1468,1469,1472],{},"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 ",[784,1467,1195],{},". Every value travels as a parameter (",[784,1470,1471],{},"$1","), never inside the SQL text.",[801,1474,1478],{"className":1475,"code":1476,"language":1477,"meta":806,"style":806},"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', 'd039…', true);  -- who writes, for triggers and the audit\n\n-- The quote. `__authorized` is the caller's row filter checked on the new row: `true` when they have none.\nWITH ins AS (INSERT INTO \"public\".\"quotes\" (\"customer\", \"site\", \"valid_until\") VALUES ($1, $2, $3) RETURNING *)\nSELECT *, true AS __authorized FROM ins;                      -- $1 = '6a0f…', $2 = '3c9e…', $3 = '2026-11-15'\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-- Each item, its foreign key set to the new quote's id.\nWITH ins AS (INSERT INTO \"public\".\"quote_items\" (\"description\", \"quantity\", \"unit_price\", \"quote\") VALUES ($1, $2, $3, $4) RETURNING *)\nSELECT *, true AS __authorized FROM ins;                      -- $4 = '7de0…', the quote's id\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\nWITH ins AS (INSERT INTO \"public\".\"quote_items\" (\"description\", \"part\", \"quantity\", \"unit_price\", \"discount_pct\", \"quote\") VALUES ($1, $2, $3, $4, $5, $6) RETURNING *)\nSELECT *, true AS __authorized FROM ins;\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-- The quote read again: its total, summed by a trigger from the items, is already right.\nSELECT * FROM \"public\".\"quotes\" WHERE \"id\" = $1;\nCOMMIT;\n","sql",[784,1479,1480,1485,1490,1495,1501,1506,1511,1516,1521,1526,1530,1535,1540,1546,1551,1556,1562,1568,1573,1578,1583,1589,1595],{"__ignoreMap":806},[810,1481,1482],{"class":812,"line":813},[810,1483,1484],{},"BEGIN;\n",[810,1486,1487],{"class":812,"line":819},[810,1488,1489],{},"SELECT set_config('statement_timeout', '30000', true),\n",[810,1491,1492],{"class":812,"line":825},[810,1493,1494],{},"       set_config('totalbase.actor_user_id', 'd039…', true);  -- who writes, for triggers and the audit\n",[810,1496,1497],{"class":812,"line":831},[810,1498,1500],{"emptyLinePlaceholder":1499},true,"\n",[810,1502,1503],{"class":812,"line":837},[810,1504,1505],{},"-- The quote. `__authorized` is the caller's row filter checked on the new row: `true` when they have none.\n",[810,1507,1508],{"class":812,"line":843},[810,1509,1510],{},"WITH ins AS (INSERT INTO \"public\".\"quotes\" (\"customer\", \"site\", \"valid_until\") VALUES ($1, $2, $3) RETURNING *)\n",[810,1512,1513],{"class":812,"line":849},[810,1514,1515],{},"SELECT *, true AS __authorized FROM ins;                      -- $1 = '6a0f…', $2 = '3c9e…', $3 = '2026-11-15'\n",[810,1517,1518],{"class":812,"line":855},[810,1519,1520],{},"INSERT INTO totalbase.logs (…) SELECT … FROM jsonb_array_elements($1::jsonb) …;    -- its audit entry\n",[810,1522,1523],{"class":812,"line":861},[810,1524,1525],{},"INSERT INTO totalbase.outbox (…) SELECT … FROM jsonb_array_elements($1::jsonb) …;  -- its event, for webhooks and workflows\n",[810,1527,1528],{"class":812,"line":867},[810,1529,1500],{"emptyLinePlaceholder":1499},[810,1531,1532],{"class":812,"line":873},[810,1533,1534],{},"-- Each item, its foreign key set to the new quote's id.\n",[810,1536,1537],{"class":812,"line":879},[810,1538,1539],{},"WITH ins AS (INSERT INTO \"public\".\"quote_items\" (\"description\", \"quantity\", \"unit_price\", \"quote\") VALUES ($1, $2, $3, $4) RETURNING *)\n",[810,1541,1543],{"class":812,"line":1542},13,[810,1544,1545],{},"SELECT *, true AS __authorized FROM ins;                      -- $4 = '7de0…', the quote's id\n",[810,1547,1549],{"class":812,"line":1548},14,[810,1550,1520],{},[810,1552,1554],{"class":812,"line":1553},15,[810,1555,1525],{},[810,1557,1559],{"class":812,"line":1558},16,[810,1560,1561],{},"WITH ins AS (INSERT INTO \"public\".\"quote_items\" (\"description\", \"part\", \"quantity\", \"unit_price\", \"discount_pct\", \"quote\") VALUES ($1, $2, $3, $4, $5, $6) RETURNING *)\n",[810,1563,1565],{"class":812,"line":1564},17,[810,1566,1567],{},"SELECT *, true AS __authorized FROM ins;\n",[810,1569,1571],{"class":812,"line":1570},18,[810,1572,1520],{},[810,1574,1576],{"class":812,"line":1575},19,[810,1577,1525],{},[810,1579,1581],{"class":812,"line":1580},20,[810,1582,1500],{"emptyLinePlaceholder":1499},[810,1584,1586],{"class":812,"line":1585},21,[810,1587,1588],{},"-- The quote read again: its total, summed by a trigger from the items, is already right.\n",[810,1590,1592],{"class":812,"line":1591},22,[810,1593,1594],{},"SELECT * FROM \"public\".\"quotes\" WHERE \"id\" = $1;\n",[810,1596,1598],{"class":812,"line":1597},23,[810,1599,1600],{},"COMMIT;\n",[780,1602,1603,1604,1607],{},"If any statement fails (a ",[784,1605,1606],{},"CHECK"," on an item, a payload check, a refused row filter), PostgreSQL rolls the whole transaction back: no quote, no items, no audit entry.",[789,1609,1611],{"id":1610},"next-steps","Next steps",[1278,1613,1614,1618],{},[1281,1615,1616,893],{},[1428,1617,628],{"href":629},[1281,1619,1620,1622],{},[1428,1621,168],{"href":169},": a master-detail form saves this way.",[1624,1625,1626],"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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":806,"searchDepth":813,"depth":819,"links":1628},[1629,1630,1631,1632,1633,1634,1635,1636],{"id":791,"depth":819,"text":792},{"id":1065,"depth":819,"text":1066},{"id":1268,"depth":819,"text":1269},{"id":1320,"depth":819,"text":1321},{"id":1344,"depth":819,"text":1345},{"id":1406,"depth":819,"text":1407},{"id":1461,"depth":819,"text":1462},{"id":1610,"depth":819,"text":1611},"Create a row together with its children - a quote with its items - in one request and one transaction.","md",{},{"title":624,"description":1637},"-rp4oChWDlBvP8HQFflxDoQ_L0PKPOkANViWNGlFTBg",[1643,1645],{"title":620,"path":621,"stem":622,"description":1644,"children":-1},"Create, update and delete rows - one, many, or by filter - with upserts, optimistic concurrency and idempotency keys.",{"title":628,"path":629,"stem":630,"description":1646,"children":-1},"Run several writes on different tables in one PostgreSQL transaction, with references between them.",1792339953618]