Follow a sample migration from pull-request checks to deployment and verification.
Add a nickname column to the built-in employee table through Git and CI. This provider-neutral walkthrough explains the migration and resulting Bytebase resources. For a complete pipeline configuration, use the GitHub Actions, GitLab CI, Azure DevOps, or Bitbucket tutorial.
Prepare the employee sample using the UI tutorial setup. In Cloud, create the sample from your project’s Instances → Connect instance → Use sample instance instead. The examples call the project HR and database hr_test; substitute your own names. Use a repository and CI runner that can reach Bytebase. A hosted runner cannot reach Bytebase through your laptop’s localhost.Install a compatible action image and configure authentication through CI secrets or workload identity. The templates below run inside that image. Replace every angle-bracket placeholder with your deployment’s value; keep credentials in the CI secret store.This is the same nickname change as First Schema Change in 5 Minutes. Use one workflow to apply it; if it already exists, inspect the completed change or use a fresh sample database.
ALTER TABLE public.employee ADD COLUMN IF NOT EXISTS nickname TEXT NOT NULL DEFAULT '';
Use the next unused version if your repository already has migrations. Open a pull request. Keep applied migrations unchanged; later changes belong in new files.
Copy the database resource name from hr_test in Bytebase. A project instance uses projects/<project_id>/instances/<instance_id>/databases/<database_name>; a workspace instance uses instances/<instance_id>/databases/<database_name>. Cloud sample databases have generated names beginning with bb_sample_, rather than hr_test.CI supplies BYTEBASE_ACCESS_TOKEN, or BYTEBASE_SERVICE_ACCOUNT and BYTEBASE_SERVICE_ACCOUNT_SECRET. Retain the output JSON even on failure. Fix errors and assess warnings before merging. FAIL_ON_WARNING also fails on warnings; the default SKIP reports findings without failing the job. See SQL Review in CI.Require both SQL Review and repository review before merge. Release-based Plans use those gates rather than a Bytebase Issue or UI Plan checks.
This creates a Release, a Plan referencing it, and a Rollout. It runs unfinished stages through the selected Test stage and waits for them. Retain the output and Plan link for verification or recovery.
Confirm the logs show the intended stage. The command can exit successfully when no stages exist or the requested stage is missing. Without --target-stage, it prepares the Rollout and returns; automatic rollout policies may still start tasks independently.
Open the Plan link from CI and inspect the Test task for hr_test. Confirm execution succeeded, then open SQL Editor for that database and run:
SELECT emp_no, first_name, last_name, nicknameFROM public.employeeORDER BY emp_noLIMIT 5;
The new nickname column contains an empty string for each employee, as specified by DEFAULT ''.The database’s Changelog records execution; Revision tracks applied migration versions. If deployment fails, inspect the existing Plan and failed task before retrying.For Test-to-Prod promotion, include both databases when creating the Plan, then reuse its returned name with --plan. Continuing a Test-only Plan does not add Prod. See Release and promotion for pipeline examples.
Follow a pull request through checks, release creation, and deployment, without any setup.
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Bytebase Docs","colors":{"primary":"#2b66ff","light":"#4faaff","dark":"#1c49be"},"logo":{"light":"https://mintcdn.com/dbx/vw8BbfZhlW9y-cr_/images/logo/logo-full.png?fit=max\u0026auto=format\u0026n=vw8BbfZhlW9y-cr_\u0026q=85\u0026s=894c5021793b82b6bcef8b09cef3d85d","dark":"https://mintcdn.com/dbx/vw8BbfZhlW9y-cr_/images/logo/logo-full-white.png?fit=max\u0026auto=format\u0026n=vw8BbfZhlW9y-cr_\u0026q=85\u0026s=9f660755d7e64c8f3d4882e66589af29"},"favicon":"https://mintcdn.com/dbx/otHCKEZkOwO4gA2D/favicon.svg?fit=max\u0026auto=format\u0026n=otHCKEZkOwO4gA2D\u0026q=85\u0026s=a7e205f761697f5ffcec570fa5de78b0","navbar":{"links":[{"href":"https://www.bytebase.com","label":"bytebase.com"}],"primary":{"type":"button","label":"Try Cloud","href":"https://cloud.bytebase.com/"}},"footer":{"socials":{"x":"https://x.com/bytebase","github":"https://github.com/bytebase/bytebase","linkedin":"https://linkedin.com/company/bytebase"}},"seo":{"metatags":{"canonical":"https://docs.bytebase.com"}},"icons":{"library":"lucide"},"integrations":{"ga4":{"measurementId":"G-4BZ4JH7449"}},"errors":{"404":{"redirect":false}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"styling":{"latex":true},"navigation":{"global":{"anchors":[]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"dbx","hasAudioNarration":false,"actualSubdomain":"dbx","customDomains":["docs.bytebase.com"],"gitSource":{"type":"github","owner":"bytebase","repo":"bytebase.com","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af2f0d28b1d48fe462fdcbc","clientVersion":"0.0.4102","searchFilterCounts":[{"language":"default","tag":"Changelog","count":54},{"language":"default","tag":"Change Management","count":46},{"language":"default","tag":"Get Started","count":43},{"language":"default","tag":"Tutorials","count":41},{"language":"default","tag":"Administration","count":32},{"language":"default","tag":"GitOps Workflow","count":24},{"language":"default","tag":"Access Control","count":23},{"language":"default","tag":"Security","count":19},{"language":"default","tag":"UI-Driven Workflow","count":15},{"language":"default","tag":"Install","count":11}]},"assistantConfig":{"enableAskAiButton":true,"enableAskAiSearchBar":false,"deflection":{"enabled":true,"email":"help@bytebase.com"}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"demo-embed.css","content":".demo-embed{position:relative;display:block;margin:1.5rem 0;border:0;border-radius:0;cursor:zoom-in;text-decoration:none!important}.demo-embed img{display:block;width:100%;margin:0!important;border-radius:0!important}.demo-embed::after{content:\"Play the interactive demo\";position:absolute;left:50%;top:50%;transform:translate(-50%, -50%);padding:0.5rem 0.875rem 0.5rem 2.25rem;border:1px solid rgb(228 228 231);border-radius:9999px;background:rgb(255 255 255 / 0.96) no-repeat 0.875rem center / 1rem 1rem\n\t\turl(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2318181b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M8 3H5a2 2 0 0 0-2 2v3M21 8V5a2 2 0 0 0-2-2h-3M3 16v3a2 2 0 0 0 2 2h3M16 21h3a2 2 0 0 0 2-2v-3'/%3E%3C/svg%3E\");color:rgb(24 24 27);font-size:0.8125rem;font-weight:500;line-height:1.25rem;box-shadow:0 2px 8px rgb(0 0 0 / 0.12);transition:transform 0.15s ease}.demo-embed:hover::after{transform:translate(-50%, -50%) scale(1.04)}.demo-dialog{position:fixed;inset:0;margin:auto;width:min(96vw, calc((100vh - 5rem) * 792 / 480), 1352px);max-width:none;max-height:none;padding:0;border:0;background:transparent;box-shadow:none;overflow:visible}.demo-dialog::backdrop{background:rgb(255 255 255 / 0.85);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}html.dark .demo-dialog::backdrop{background:rgb(9 9 11 / 0.85)}.demo-dialog iframe{display:block;width:100%;aspect-ratio:792 / 480;border:0}.demo-dialog__close{position:fixed;top:1rem;right:1rem;display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;border:1px solid rgb(228 228 231);border-radius:9999px;background:#fff;color:rgb(24 24 27);font-size:1.25rem;line-height:1;cursor:pointer}html.dark .demo-dialog__close{border-color:rgb(63 63 70);background:rgb(24 24 27);color:#fff}"}],"page":{"pagePath":"gitops/migration-based-workflow/tutorial","slug":"/gitops/migration-based-workflow/tutorial","pageMetadata":{"title":"Change a Database with GitOps","sidebarTitle":"Walkthrough","description":"Follow a sample migration from pull-request checks to deployment and verification.","href":"/gitops/migration-based-workflow/tutorial"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Follow a sample migration from pull-request checks to deployment and verification.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Add a nickname column to the built-in `,_jsx(_components.code,{children:`employee`}),` table through Git and CI. This provider-neutral walkthrough explains the migration and resulting Bytebase resources. For a complete pipeline configuration, use the `,_jsx(_components.a,{href:`/tutorials/gitops-github-workflow`,children:`GitHub Actions`}),`, `,_jsx(_components.a,{href:`/tutorials/gitops-gitlab-workflow`,children:`GitLab CI`}),`, `,_jsx(_components.a,{href:`/tutorials/gitops-azure-devops-workflow`,children:`Azure DevOps`}),`, or `,_jsx(_components.a,{href:`/tutorials/gitops-bitbucket-workflow`,children:`Bitbucket`}),` tutorial.`]}),`\n`,_jsx(Heading,{level:`2`,id:`before-you-start`,children:`Before you start`}),`\n`,_jsxs(_components.p,{children:[`Prepare the employee sample using the `,_jsx(_components.a,{href:`/tutorials/first-schema-change#step-1-setup-bytebase`,children:`UI tutorial setup`}),`. In Cloud, create the sample from your project’s `,_jsx(_components.strong,{children:`Instances → Connect instance → Use sample instance`}),` instead. The examples call the project `,_jsx(_components.strong,{children:`HR`}),` and database `,_jsx(_components.code,{children:`hr_test`}),`; substitute your own names. Use a repository and CI runner that can reach Bytebase. A hosted runner cannot reach Bytebase through your laptop’s `,_jsx(_components.code,{children:`localhost`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`Install a `,_jsx(_components.a,{href:`/gitops/installation`,children:`compatible action image`}),` and configure authentication through CI secrets or `,_jsx(_components.a,{href:`/administration/workload-identity/github-actions`,children:`workload identity`}),`. The templates below run inside that image. Replace every angle-bracket placeholder with your deployment’s value; keep credentials in the CI secret store.`]}),`\n`,_jsxs(_components.p,{children:[`This is the same nickname change as `,_jsx(_components.a,{href:`/tutorials/first-schema-change`,children:`First Schema Change in 5 Minutes`}),`. Use one workflow to apply it; if it already exists, inspect the completed change or use a fresh sample database.`]}),`\n`,_jsx(Heading,{level:`2`,id:`1-add-the-migration`,children:`1. Add the migration`}),`\n`,_jsxs(_components.p,{children:[`Create `,_jsx(_components.code,{children:`migrations/V1_add_employee_nickname.sql`}),`:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`ALTER`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` TABLE`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` public`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`employee`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` ADD`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` COLUMN `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`IF`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` NOT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` EXISTS`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` nickname `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`TEXT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` NOT NULL`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` DEFAULT`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` ''`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Use the next unused version if your repository already has migrations. Open a pull request. Keep applied migrations unchanged; later changes belong in new files.`}),`\n`,_jsx(Heading,{level:`2`,id:`2-check-the-pull-request`,children:`2. Check the pull request`}),`\n`,_jsx(_components.p,{children:`Configure the review job to run:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`bytebase-action check \\\\`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --url `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\u003cbytebase_url>\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --project `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"projects/\u003cproject_id>\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --targets `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\u003cdatabase_resource_name>\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --file-pattern `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"migrations/*.sql\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \\\\`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --check-release=FAIL_ON_ERROR \\\\`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --output `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"bytebase-check.json\"`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Copy the database resource name from `,_jsx(_components.code,{children:`hr_test`}),` in Bytebase. A project instance uses `,_jsx(_components.code,{children:`projects/\u003cproject_id>/instances/\u003cinstance_id>/databases/\u003cdatabase_name>`}),`; a workspace instance uses `,_jsx(_components.code,{children:`instances/\u003cinstance_id>/databases/\u003cdatabase_name>`}),`. Cloud sample databases have generated names beginning with `,_jsx(_components.code,{children:`bb_sample_`}),`, rather than `,_jsx(_components.code,{children:`hr_test`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`CI supplies `,_jsx(_components.code,{children:`BYTEBASE_ACCESS_TOKEN`}),`, or `,_jsx(_components.code,{children:`BYTEBASE_SERVICE_ACCOUNT`}),` and `,_jsx(_components.code,{children:`BYTEBASE_SERVICE_ACCOUNT_SECRET`}),`. Retain the output JSON even on failure. Fix errors and assess warnings before merging. `,_jsx(_components.code,{children:`FAIL_ON_WARNING`}),` also fails on warnings; the default `,_jsx(_components.code,{children:`SKIP`}),` reports findings without failing the job. See `,_jsx(_components.a,{href:`/gitops/migration-based-workflow/sql-review-ci`,children:`SQL Review in CI`}),`.`]}),`\n`,_jsx(_components.p,{children:`Require both SQL Review and repository review before merge. Release-based Plans use those gates rather than a Bytebase Issue or UI Plan checks.`}),`\n`,_jsx(Heading,{level:`2`,id:`3-merge-and-deploy`,children:`3. Merge and deploy`}),`\n`,_jsx(_components.p,{children:`After merge, the deployment job runs:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`bytebase-action rollout \\\\`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --url `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\u003cbytebase_url>\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --project `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"projects/\u003cproject_id>\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --targets `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\u003cdatabase_resource_name>\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --file-pattern `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"migrations/*.sql\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --target-stage `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"environments/\u003ctest_environment_id>\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` --output `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"bytebase-result.json\"`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`This creates a `,_jsx(_components.a,{href:`/concepts/release`,children:`Release`}),`, a `,_jsx(_components.a,{href:`/concepts/plan`,children:`Plan`}),` referencing it, and a `,_jsx(_components.a,{href:`/concepts/rollout`,children:`Rollout`}),`. It runs unfinished stages through the selected Test stage and waits for them. Retain the output and Plan link for verification or recovery.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Confirm the logs show the intended stage. The command can exit successfully when no stages exist or the requested stage is missing. Without `,_jsx(_components.code,{children:`--target-stage`}),`, it prepares the Rollout and returns; automatic rollout policies may still start tasks independently.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`4-verify-the-change`,children:`4. Verify the change`}),`\n`,_jsxs(_components.p,{children:[`Open the Plan link from CI and inspect the Test task for `,_jsx(_components.code,{children:`hr_test`}),`. Confirm execution succeeded, then open `,_jsx(_components.strong,{children:`SQL Editor`}),` for that database and run:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`SELECT`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` emp_no, first_name, last_name, nickname`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`FROM`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` public`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`employee`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`ORDER BY`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` emp_no`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`LIMIT`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 5`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The new `,_jsx(_components.code,{children:`nickname`}),` column contains an empty string for each employee, as specified by `,_jsx(_components.code,{children:`DEFAULT ''`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`The database’s `,_jsx(_components.strong,{children:`Changelog`}),` records execution; `,_jsx(_components.strong,{children:`Revision`}),` tracks applied migration versions. If deployment fails, inspect the existing Plan and failed task before retrying.`]}),`\n`,_jsxs(_components.p,{children:[`For Test-to-Prod promotion, include both databases when creating the Plan, then reuse its returned name with `,_jsx(_components.code,{children:`--plan`}),`. Continuing a Test-only Plan does not add Prod. See `,_jsx(_components.a,{href:`/gitops/migration-based-workflow/release`,children:`Release and promotion`}),` for pipeline examples.`]}),`\n`,_jsx(Heading,{level:`2`,id:`interactive-demo`,children:`Interactive demo`}),`\n`,_jsx(_components.p,{children:`Follow a pull request through checks, release creation, and deployment, without any setup.`}),`\n`,_jsx(`a`,{className:`demo-embed`,href:`https://www.bytebase.com/demo/gitops/`,\"data-demo\":`https://www.bytebase.com/demo/gitops/demo`,\"data-title\":`Bytebase GitOps interactive demo`,children:_jsx(`img`,{noZoom:true,src:`https://mintcdn.com/dbx/G4lL8ZfD8KS2X7_N/images/demo/gitops.webp?fit=max\u0026auto=format\u0026n=G4lL8ZfD8KS2X7_N\u0026q=85\u0026s=a144dad6176428a476712ceda220001a`,alt:`Bytebase GitOps interactive demo: Develop, Review, Release, History`,\"data-og-width\":`1520`,width:`1520`,\"data-og-height\":`902`,height:`902`,\"data-path\":`images/demo/gitops.webp`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/dbx/G4lL8ZfD8KS2X7_N/images/demo/gitops.webp?w=280\u0026fit=max\u0026auto=format\u0026n=G4lL8ZfD8KS2X7_N\u0026q=85\u0026s=3a0b56f2e225c777cd2c7151d3d67da3 280w, https://mintcdn.com/dbx/G4lL8ZfD8KS2X7_N/images/demo/gitops.webp?w=560\u0026fit=max\u0026auto=format\u0026n=G4lL8ZfD8KS2X7_N\u0026q=85\u0026s=1329745a33bf23dc94536bce078a49f2 560w, https://mintcdn.com/dbx/G4lL8ZfD8KS2X7_N/images/demo/gitops.webp?w=840\u0026fit=max\u0026auto=format\u0026n=G4lL8ZfD8KS2X7_N\u0026q=85\u0026s=ec16974c4a6eba0fda86d982c410b33a 840w, https://mintcdn.com/dbx/G4lL8ZfD8KS2X7_N/images/demo/gitops.webp?w=1100\u0026fit=max\u0026auto=format\u0026n=G4lL8ZfD8KS2X7_N\u0026q=85\u0026s=48d0ff900bf17f2c388dce7de39e0e48 1100w, https://mintcdn.com/dbx/G4lL8ZfD8KS2X7_N/images/demo/gitops.webp?w=1650\u0026fit=max\u0026auto=format\u0026n=G4lL8ZfD8KS2X7_N\u0026q=85\u0026s=358280f0bf9284571297303c0ec47651 1650w, https://mintcdn.com/dbx/G4lL8ZfD8KS2X7_N/images/demo/gitops.webp?w=2500\u0026fit=max\u0026auto=format\u0026n=G4lL8ZfD8KS2X7_N\u0026q=85\u0026s=45e363eb9cb7bd9b1973f83093b14426 2500w`})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Change a Database with GitOps","sidebarTitle":"Walkthrough","description":"Follow a sample migration from pull-request checks to deployment and verification.","href":"/gitops/migration-based-workflow/tutorial"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Before you start","slug":"before-you-start","depth":2,"children":[]},{"title":"1. Add the migration","slug":"1-add-the-migration","depth":2,"children":[]},{"title":"2. Check the pull request","slug":"2-check-the-pull-request","depth":2,"children":[]},{"title":"3. Merge and deploy","slug":"3-merge-and-deploy","depth":2,"children":[]},{"title":"4. Verify the change","slug":"4-verify-the-change","depth":2,"children":[]},{"title":"Interactive demo","slug":"interactive-demo","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/dbx/c3c3611938944066/demo-embed.js"],"subdomain":"dbx","siteName":"Bytebase Docs","title":"Change a Database with GitOps - Bytebase Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-14T12:02:19.097Z","originalFileLocation":"gitops/migration-based-workflow/tutorial.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Follow a sample migration from pull-request checks to deployment and verification.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Bytebase Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/dbx/R2-p_QktkMNyxiB0/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/dbx/R2-p_QktkMNyxiB0/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/dbx/R2-p_QktkMNyxiB0/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/dbx/R2-p_QktkMNyxiB0/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/dbx/R2-p_QktkMNyxiB0/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/dbx/R2-p_QktkMNyxiB0/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/dbx/R2-p_QktkMNyxiB0/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/dbx/R2-p_QktkMNyxiB0/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/dbx/R2-p_QktkMNyxiB0/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Change a Database with GitOps - Bytebase Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Follow a sample migration from pull-request checks to deployment and verification.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Bytebase Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.bytebase.com/gitops/migration-based-workflow/tutorial\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://dbx.mintlify.site/_mintlify/api/og/v2?division=Migration-Based+Workflow\u0026amp;title=Change+a+Database+with+GitOps\u0026amp;description=Follow+a+sample+migration+from+pull-request+checks+to+deployment+and+verification.\u0026amp;theme=2e759ed1f2242d273808a7b9\u0026amp;signature=2d4adcd9bdf308402db59f673bd640e31b954952d2d51eb767a06a9ba9c7a3da\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Change a Database with GitOps - Bytebase Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Follow a sample migration from pull-request checks to deployment and verification.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://dbx.mintlify.site/_mintlify/api/og/v2?division=Migration-Based+Workflow\u0026amp;title=Change+a+Database+with+GitOps\u0026amp;description=Follow+a+sample+migration+from+pull-request+checks+to+deployment+and+verification.\u0026amp;theme=2e759ed1f2242d273808a7b9\u0026amp;signature=2d4adcd9bdf308402db59f673bd640e31b954952d2d51eb767a06a9ba9c7a3da\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/dbx/R2-p_QktkMNyxiB0/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Bytebase Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#2b66ff\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.bytebase.com/gitops/migration-based-workflow/tutorial\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/gitops/migration-based-workflow/tutorial.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.bytebase.com/#organization\",\"name\":\"Bytebase Docs\",\"url\":\"https://docs.bytebase.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/dbx/vw8BbfZhlW9y-cr_/images/logo/logo-full.png?fit=max\u0026auto=format\u0026n=vw8BbfZhlW9y-cr_\u0026q=85\u0026s=894c5021793b82b6bcef8b09cef3d85d\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.bytebase.com#website\",\"name\":\"Bytebase Docs\",\"url\":\"https://docs.bytebase.com\",\"publisher\":{\"@id\":\"https://docs.bytebase.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.bytebase.com/gitops/migration-based-workflow/tutorial#webpage\",\"url\":\"https://docs.bytebase.com/gitops/migration-based-workflow/tutorial\",\"name\":\"Change a Database with GitOps\",\"description\":\"Follow a sample migration from pull-request checks to deployment and verification.\",\"dateModified\":\"2026-10-14T12:02:19.097Z\",\"isPartOf\":{\"@id\":\"https://docs.bytebase.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.bytebase.com/gitops/migration-based-workflow/tutorial#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.bytebase.com/gitops/migration-based-workflow/tutorial#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"GitOps Workflow\",\"item\":\"https://docs.bytebase.com/gitops/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Migration-Based Workflow\",\"item\":\"https://docs.bytebase.com/gitops/migration-based-workflow/overview\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Change a Database with GitOps\",\"item\":\"https://docs.bytebase.com/gitops/migration-based-workflow/tutorial\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.bytebase.com/gitops/migration-based-workflow/tutorial#article\",\"headline\":\"Change a Database with GitOps\",\"name\":\"Change a Database with GitOps\",\"description\":\"Follow a sample migration from pull-request checks to deployment and verification.\",\"url\":\"https://docs.bytebase.com/gitops/migration-based-workflow/tutorial\",\"mainEntityOfPage\":{\"@id\":\"https://docs.bytebase.com/gitops/migration-based-workflow/tutorial#webpage\"},\"dateModified\":\"2026-10-14T12:02:19.097Z\",\"publisher\":{\"@id\":\"https://docs.bytebase.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.bytebase.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Bytebase Docs\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Bytebase Docs\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/gitops/migration-based-workflow/tutorial.md","siteName":"Bytebase Docs","nav":{"global":{"anchors":[]},"tabs":[{"tab":"Get Started","pages":[{"title":"Get Started","href":"/introduction/what-is-bytebase"}]},{"tab":"Change Management","groups":[{"group":"Database CI/CD","pages":[{"title":"Overview","href":"/change-database/change-workflow"},{"title":"SQL Review Policy","href":"/sql-review/review-policy"},{"title":"Changelog","href":"/change-database/change-history"},{"title":"Webhook","href":"/change-database/webhook"},{"title":"Settings","href":"/change-database/settings"}]},{"group":"UI-Driven Workflow","pages":[{"title":"Overview","href":"/change-database/overview"},{"title":"First Schema Change in 5 Minutes","href":"/tutorials/first-schema-change"},{"group":"Change","pages":[{"title":"Plan","href":"/change-database/plan"},{"title":"Batch Change","href":"/change-database/batch-change"},{"title":"Schema Synchronization","href":"/change-database/synchronize-schema"},{"title":"Online Schema Migration for MySQL","href":"/change-database/online-schema-migration-for-mysql"},{"title":"Transaction Mode","href":"/change-database/transaction-mode"},{"title":"Schema Editor","href":"/change-database/schema-editor"}]},{"title":"Review","href":"/change-database/review"},{"group":"Approval","pages":[{"title":"Custom Approval","href":"/change-database/approval"},{"title":"Risk Center","href":"/administration/risks"}]},{"group":"Rollout","pages":[{"title":"Rollout Permissions","href":"/change-database/environment-policy/rollout-policy"},{"title":"Scheduled Rollout","href":"/change-database/scheduled-rollout"}]},{"group":"Rollback","pages":[{"title":"Data Rollback","href":"/change-database/rollback-data-changes"},{"title":"Schema Rollback","href":"/change-database/rollback-schema-changes"}]}]},{"group":"GitOps Workflow","pages":[{"title":"Overview","href":"/gitops/overview"},{"title":"Installation","href":"/gitops/installation"},{"group":"Migration-Based Workflow","pages":[{"title":"Overview","description":null,"href":"/gitops/migration-based-workflow/overview"},{"title":"Change a Database with GitOps","sidebarTitle":"Walkthrough","href":"/gitops/migration-based-workflow/tutorial"},{"title":"Develop","description":null,"href":"/gitops/migration-based-workflow/develop"},{"title":"SQL Review CI","href":"/gitops/migration-based-workflow/sql-review-ci"},{"title":"Release","href":"/gitops/migration-based-workflow/release"},{"title":"Limitations","href":"/gitops/migration-based-workflow/limitations"}]},{"group":"State-Based Workflow (SDL)","pages":[{"title":"Overview","href":"/gitops/state-based-workflow/overview"},{"title":"Develop","href":"/gitops/state-based-workflow/develop"},{"title":"SQL Review CI","href":"/gitops/state-based-workflow/sql-review-ci"},{"title":"Release","href":"/gitops/state-based-workflow/release"},{"title":"Limitations","href":"/gitops/state-based-workflow/limitations"}]},{"group":"Best Practices","pages":[{"title":"Overview","href":"/gitops/best-practices/overview"},{"title":"File Organization","href":"/gitops/best-practices/file-organization"},{"title":"Migration Guidelines","href":"/gitops/best-practices/migration-guidelines"},{"title":"Git and CI/CD","href":"/gitops/best-practices/git-and-cicd"},{"title":"SQL Review and Security","href":"/gitops/best-practices/sql-review-and-security"},{"title":"Performance Optimization","href":"/gitops/best-practices/performance"}]},{"group":"Troubleshooting","pages":[{"title":"Overview","href":"/gitops/troubleshooting/overview"},{"title":"Release and Plan Issues","href":"/gitops/troubleshooting/release-and-plan"},{"title":"Rollout Issues","href":"/gitops/troubleshooting/rollout"},{"title":"SDL Issues","href":"/gitops/troubleshooting/sdl-issues"},{"title":"CI/CD Issues","href":"/gitops/troubleshooting/cicd-issues"}]}]},{"group":"Appendix","pages":[{"title":"Review Rules","href":"/sql-review/review-rules"},{"title":"Error Codes","href":"/sql-review/error-codes"}]}]},{"tab":"Access Control","pages":[{"title":"Access Control","href":"/security/database-permission/overview"}]},{"tab":"Administration","pages":[{"title":"Administration","href":"/ai-assistant"}]},{"tab":"Tutorials","pages":[{"title":"Tutorials","href":"/tutorials/risks-best-practice"}]},{"tab":"API Reference","href":"https://api.bytebase.com"},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog/bytebase-3-24-1"}]}]},"basePath":"","title":"Change a Database with GitOps - Bytebase Docs","buildId":"dpl_596ePT575z4qnAFksq1biRW97aLY","deploymentId":"dpl_596ePT575z4qnAFksq1biRW97aLY","dynamics":[],"chunks":[]}