Я не могу извлечь таблицы .sql CREATE TABLE для каждой таблицы в базе данных SQL Azure в репозитории Azure

Как говорится в вопросе, как я могу это сделать? Это сценарий, который я сейчас использую для создания файла .dacpac, но я видел, что это можно сделать с помощью сценария PowerShell вместо AzureCLI@2?

Я попробовал этот сценарий AzureCLI@2:

- task: AzureCLI@2
  inputs:
    azureSubscription: '$(azureSubscription)'
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      set -e
      echo "Starting DACPAC extraction..."     
      # Obtain an access token
      echo "Obtaining access token..."
      accessToken=$(az account get-access-token --resource https://database.windows.net/ --query accessToken --output tsv)
      echo "Access token obtained."
      # Check if the access token was retrieved
      if [ -z "$accessToken" ]; then
        echo "Failed to obtain access token. Exiting."
        exit 1
      fi
      # Create directories if they don't exist
      mkdir -p $(Build.SourcesDirectory)/temp/DACPAC
      mkdir -p $(Build.SourcesDirectory)/some/ran/dir/
      # Extract DACPAC file to a temporary directory
      echo "Extracting DACPAC file..."
      ./sqlpackage/sqlpackage /Action:Extract /SourceServerName:$(sqlServerName) /SourceDatabaseName:$(sqlDatabaseName) /TargetFile:$(Build.SourcesDirectory)/temp/DACPAC/$(sqlDatabaseName).dacpac /AccessToken:$accessToken
      # Unzip the extracted DACPAC file
      echo "Unzipping DACPAC file..."
      unzip -o $(Build.SourcesDirectory)/temp/DACPAC/$(sqlDatabaseName).dacpac -d $(Build.SourcesDirectory)/temp/DACPAC     
      # Move extracted schema files to the target directory, replacing existing files
      echo "Replacing existing .sql files with updated schema..."
      find $(Build.SourcesDirectory)/temp/DACPAC -name '*.sql' -exec cp -v {} $(Build.SourcesDirectory)/some/ran/dir/ \; 2>error.log      
      echo "Schema extraction and replacement completed."
      echo "Listing files in target directory..."
      ls -l $(Build.SourcesDirectory)/some/ran/dir/  
      ls -l $(Build.SourcesDirectory)/temp/DACPAC
      # Commit and push the changes
      echo "Committing and pushing changes..."
      cd $(Build.SourcesDirectory)
      git config --global user.email "$(sqlAdminLogin)"
      git config --global user.name "Name"
      git add --all
      git status
      git commit -m "Update schema files from DACPAC extraction" || echo "No changes to commit"
      git push https://$(azureDevOpsPat)@dev.azure.com/my/git/repo/here HEAD:$(Build.SourceBranch) --force
      ls -l $(Build.SourcesDirectory)/some/ran/dir/
      echo "Changes committed and pushed."

Я ожидал, что он перенесет файлы в указанное место, но там просто написано: «Отсоединенная голова». Попытка изменить ветку репо с помощью проверки и создания временной ветки также не работает.

Обновление №1

Вот что показывает мой конвейер для вышеупомянутой задачи:

HEAD detached at fc510bf
nothing to commit, working tree clean
HEAD detached at fc510bf
nothing to commit, working tree clean
No changes to commit
Everything up-to-date

Однако каждый скрипт отображается в следующем каталоге:

-rw-r--r-- 1 vsts docker  995 Jul 24 06:42 Surgeons.sql

Обновление №2

Следующий путь работает, но я добавил его в свой .gitignore, так как мне нужны только сценарии .sql для каждой таблицы:

$(Build.SourcesDirectory)/temp/DACPAC

Обновление №3

Скрипт тянет этот скрипт:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Contact Report](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Report Date] [datetime] NOT NULL,
    [Report Description] [text] NOT NULL,
    [Customer ID] [varchar](50) NOT NULL,
    [Location] [varchar](100) NOT NULL,
    [Follow Up] [varchar](100) NOT NULL,
    [Feedback] [text] NOT NULL,
    [Notes] [text] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[Contact Report] ADD PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
GO

Но он должен вытащить этот сценарий (как используется в фабрике данных Azure):

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Contact Report](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Report Date] [datetime] NOT NULL,
    [Report Description] [text] NOT NULL,
    [Customer ID] [varchar](50) NOT NULL,
    [Location] [varchar](100) NOT NULL,
    [Follow Up] [varchar](100) NOT NULL,
    [Feedback] [text] NOT NULL,
    [Notes] [text] NOT NULL,
    [Staff ID] [varchar](10) NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[Contact Report] ADD PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Contact Report]  WITH CHECK ADD  CONSTRAINT [FK_ContactReport_Staff] FOREIGN KEY([Staff ID])
REFERENCES [dbo].[Staff] ([Staff ID])
GO
ALTER TABLE [dbo].[Contact Report] CHECK CONSTRAINT [FK_ContactReport_Staff]
GO

-Обновление №4

   echo "Extracting DACPAC file..."
   ./sqlpackage/sqlpackage /Action:Extract /SourceServerName:$(sqlServerName) /SourceDatabaseName:$(sqlDatabaseName) /TargetFile:$(Build.SourcesDirectory)/temp/DACPAC/$(sqlDatabaseName).dacpac /AccessToken:$accessToken
   # Unzip the extracted DACPAC file
   echo "Unzipping DACPAC file..."
   unzip -o $(Build.SourcesDirectory)/temp/DACPAC/$(sqlDatabaseName).dacpac -d $(Build.SourcesDirectory)/temp/DACPAC     
   # Move extracted schema files to the target directory, replacing existing files
   echo "Replacing existing .sql files with updated schema..."
   find $(Build.SourcesDirectory)/temp/DACPAC -name '*.sql' -exec cp -v {} $(Build.SourcesDirectory)/Database/dbo/Tables/ \; 2>error.log 

С какими проблемами вы столкнулись при запуске скрипта? Можете ли вы поделиться более подробной информацией?

Kevin Lu-MSFT 24.07.2024 09:26

Вот ответ, который я получаю в конвейере (однако тест проходит успешно): «HEAD отключен на fc510bf, ничего не нужно фиксировать, рабочее дерево чистое. Никаких изменений для фиксации нет. Все актуально. Изменения зафиксированы и отправлены». Все сценарии корректно отображаются в списке с помощью: ls -l $(Build.SourcesDirectory)/some/ran/repo/

WorkingProgrammer 24.07.2024 09:34

После запуска конвейера вы видите ожидаемые файлы в репозитории? Если возможно, вы можете обновить вопрос, чтобы поделиться журналами конвейера.

Kevin Lu-MSFT 24.07.2024 09:35

В обновленном журнале появляется сообщение: No changes to commit Everything up-to-date Это означает, что файлы не обновляются при выполнении действия git push. Можете ли вы подтвердить, что файлы .sql менялись при каждом запуске конвейера? Если файл sql не изменяется, он не может внести какие-либо изменения в репо.

Kevin Lu-MSFT 24.07.2024 09:53

Сценарии, которые он извлекает, взяты из текущей схемы в базе данных, которая отличается от той, которая сейчас находится в репозитории, поэтому можно внести изменения.

WorkingProgrammer 24.07.2024 09:58

Можете ли вы добавить cat $(Build.SourcesDirectory)/some/ran/dir/sqlfilename.sql в скрипт bash для вывода содержимого? И затем вы можете дважды подтвердить, отличается ли содержимое файла от файла в репо.

Kevin Lu-MSFT 24.07.2024 10:06

Считается ли по-прежнему лучшей практикой сохранение файла .dacpac в своем репозитории и удаление сценариев SQL базы данных для всех таблиц?

WorkingProgrammer 24.07.2024 10:07

Насколько я знаю, файл dacpac и файл sql можно использовать для хранения таблиц. Это зависит от ваших предпочтений. Но нынешний вопрос не должен быть связан с этим пунктом. Это больше связано с самим git. Нам нужно убедиться, что файлы в репозитории изменились. Затем мы можем выполнить действие фиксации и отправки.

Kevin Lu-MSFT 24.07.2024 10:13

Я отвечу дополнительным обновлением выше.

WorkingProgrammer 24.07.2024 10:25

Судя по последнему обновлению, вы имеете в виду, что сценарий извлекает неправильный файл сценария sql?

Kevin Lu-MSFT 24.07.2024 10:31

Файл .sql, который извлекает скрипт, хранится в моем репозитории, который является более старой версией. Сценарий не извлекает обновленный файл .sql из базы данных sql.

WorkingProgrammer 24.07.2024 10:33

Могу ли я узнать, имеют ли два файла sql одинаковое имя (извлечь из сценария и файла sql в репозитории)? Если да, можете ли вы скопировать обновленный файл sql в новую папку и проверить, может ли он отображать ожидаемый сценарий?

Kevin Lu-MSFT 24.07.2024 10:38

С другой стороны, вам также необходимо проверить, извлекает ли команда sqlpackage правильную базу данных.

Kevin Lu-MSFT 24.07.2024 10:51

Я попробовал это и потратил последнее время, пытаясь разобраться в проблеме. Это не приведет к внесению каких-либо изменений в репо даже после добавления новой папки. Там сказано, что никаких изменений не обнаружено. Все равно получил отдельно услышанную ошибку. Пробовал использовать git checkout $(Build.SourceBranch), но безрезультатно. Он извлекает правильную базу данных. Переменные правильно определены и отлично работают во всех других случаях использования.

WorkingProgrammer 24.07.2024 11:25

Отсутствующий звуковой сигнал не является ошибкой. Это ожидаемое поведение при запуске git status. Только добавляя новую папку без каких-либо файлов, она все равно показывает вывод «ничего не фиксировать». Вам необходимо добавить новый файл в новую папку. Затем он покажет обновленный коммит. С другой стороны, вы можете попробовать удалить файл .gitignore и проверить, работает ли он.

Kevin Lu-MSFT 24.07.2024 11:46

.gitignore не игнорирует файлы .sql. Я пытаюсь добавить извлеченные файлы .sql из базы данных в новую папку, но ничего не получается. Я добавил файл в новую папку, но все равно ничего. Он добавляет новый файл и папку, но не добавляет в папку извлеченные сценарии sql. Я добавил обновление строк, касающихся dacpac.

WorkingProgrammer 24.07.2024 12:26

Вы имеете в виду, что при отправке git push будет игнорироваться только файл .sql, а другие файлы можно будет отправить в репо?

Kevin Lu-MSFT 24.07.2024 12:56

Итак, все файлы помещаются в репозиторий, за исключением файлов, извлеченных из .dacpac.

WorkingProgrammer 24.07.2024 13:15

Можете ли вы подтвердить, содержатся ли файлы sql в пакете dacpac? Согласно моему тесту, когда я разархивирую файл .dacpac, он содержит только файлы XML.

Kevin Lu-MSFT 24.07.2024 13:19

Попробуйте добавить аргумент: /p:ExtractTarget=File в команду sqlpackage. Например: ./sqlpackage/sqlpackage /Action:Extract /SourceServerName:$(sqlServerName) /SourceDatabaseName:$(sqlDatabaseName) /TargetFile:$(Build.SourcesDirectory)/temp/DACPAC/$(sqlDatab‌​aseName).dacpac /AccessToken:$accessToken /p:ExtractTarget=File В этом случае файл dacpac будет содержать файл sql.

Kevin Lu-MSFT 24.07.2024 13:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
20
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из сценария Bash, которым вы поделились, причина проблемы может заключаться в том, что следующая команда извлекает только один файл .dacpac. В выводе нет файлов .sql.

./sqlpackage/sqlpackage /Action:Extract /SourceServerName:$(sqlServerName) /SourceDatabaseName:$(sqlDatabaseName) /TargetFile:$(Build.SourcesDirectory)/temp/DACPAC/$(sqlDatabaseName).dacpac /AccessToken:$accessToken

Чтобы решить эту проблему, нам нужно добавить аргумент: /p:ExtractTarget=File в команду sqlpackage. Если вы не определили аргумент ExtractTarget, по умолчанию ему будет присвоено значение DacPac.

Например:

./sqlpackage/sqlpackage /Action:Extract /SourceServerName:$(sqlServerName) /SourceDatabaseName:$(sqlDatabaseName) /TargetFile:$(Build.SourcesDirectory)/temp/DACPAC/$(sqlDatabaseName).dacpac /AccessToken:$accessToken /p:ExtractTarget=File

В этом случае будет выведен один .dacpac файл и один или несколько .sql файлов.

Затем вы можете скопировать файлы .sql в целевую папку и отправить их в Azure Repo.

Для получения более подробной информации вы можете обратиться к этому документу: Параметры и свойства SqlPackage Extract

Другие вопросы по теме

Уведомление конвейера Azure DevOps для прямого сообщения команд
Как добавить пользовательские утверждения для пользователей Azure AD
Azure: пакета под названием «dynlm» не существует
Пока включено иерархическое пространство имен, невозможно загрузить большой двоичный объект с метаданными hdi_isfolder
Можете ли вы создать «Потоки пользователей» в Azure с помощью учетной записи с оплатой по мере использования?
Пользовательское утверждение Entra внешнего идентификатора в токене идентификатора клиента, а не в ClaimsPrincipal пользователя веб-API ASP.NET Core
SchemaColumnConvertNotSupportedException: столбец: [Col_Name], физический тип: INT64, логический тип: строка
Невозможно прочитать большие двоичные объекты через BlobContainerClient для больших двоичных объектов с пустыми префиксами папок
Создать секрет Azure Keyvault, не раскрывая значения
Как создать функцию Azure, которая развертывает мой сценарий бицепса из учетной записи хранения Azure