Как говорится в вопросе, как я могу это сделать? Это сценарий, который я сейчас использую для создания файла .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
Вот ответ, который я получаю в конвейере (однако тест проходит успешно): «HEAD отключен на fc510bf, ничего не нужно фиксировать, рабочее дерево чистое. Никаких изменений для фиксации нет. Все актуально. Изменения зафиксированы и отправлены». Все сценарии корректно отображаются в списке с помощью: ls -l $(Build.SourcesDirectory)/some/ran/repo/
После запуска конвейера вы видите ожидаемые файлы в репозитории? Если возможно, вы можете обновить вопрос, чтобы поделиться журналами конвейера.
В обновленном журнале появляется сообщение: No changes to commit Everything up-to-date
Это означает, что файлы не обновляются при выполнении действия git push. Можете ли вы подтвердить, что файлы .sql менялись при каждом запуске конвейера? Если файл sql не изменяется, он не может внести какие-либо изменения в репо.
Сценарии, которые он извлекает, взяты из текущей схемы в базе данных, которая отличается от той, которая сейчас находится в репозитории, поэтому можно внести изменения.
Можете ли вы добавить cat $(Build.SourcesDirectory)/some/ran/dir/sqlfilename.sql
в скрипт bash для вывода содержимого? И затем вы можете дважды подтвердить, отличается ли содержимое файла от файла в репо.
Считается ли по-прежнему лучшей практикой сохранение файла .dacpac в своем репозитории и удаление сценариев SQL базы данных для всех таблиц?
Насколько я знаю, файл dacpac и файл sql можно использовать для хранения таблиц. Это зависит от ваших предпочтений. Но нынешний вопрос не должен быть связан с этим пунктом. Это больше связано с самим git. Нам нужно убедиться, что файлы в репозитории изменились. Затем мы можем выполнить действие фиксации и отправки.
Я отвечу дополнительным обновлением выше.
Судя по последнему обновлению, вы имеете в виду, что сценарий извлекает неправильный файл сценария sql?
Файл .sql, который извлекает скрипт, хранится в моем репозитории, который является более старой версией. Сценарий не извлекает обновленный файл .sql из базы данных sql.
Могу ли я узнать, имеют ли два файла sql одинаковое имя (извлечь из сценария и файла sql в репозитории)? Если да, можете ли вы скопировать обновленный файл sql в новую папку и проверить, может ли он отображать ожидаемый сценарий?
С другой стороны, вам также необходимо проверить, извлекает ли команда sqlpackage правильную базу данных.
Я попробовал это и потратил последнее время, пытаясь разобраться в проблеме. Это не приведет к внесению каких-либо изменений в репо даже после добавления новой папки. Там сказано, что никаких изменений не обнаружено. Все равно получил отдельно услышанную ошибку. Пробовал использовать git checkout $(Build.SourceBranch), но безрезультатно. Он извлекает правильную базу данных. Переменные правильно определены и отлично работают во всех других случаях использования.
Отсутствующий звуковой сигнал не является ошибкой. Это ожидаемое поведение при запуске git status. Только добавляя новую папку без каких-либо файлов, она все равно показывает вывод «ничего не фиксировать». Вам необходимо добавить новый файл в новую папку. Затем он покажет обновленный коммит. С другой стороны, вы можете попробовать удалить файл .gitignore и проверить, работает ли он.
.gitignore не игнорирует файлы .sql. Я пытаюсь добавить извлеченные файлы .sql из базы данных в новую папку, но ничего не получается. Я добавил файл в новую папку, но все равно ничего. Он добавляет новый файл и папку, но не добавляет в папку извлеченные сценарии sql. Я добавил обновление строк, касающихся dacpac.
Вы имеете в виду, что при отправке git push будет игнорироваться только файл .sql, а другие файлы можно будет отправить в репо?
Итак, все файлы помещаются в репозиторий, за исключением файлов, извлеченных из .dacpac.
Можете ли вы подтвердить, содержатся ли файлы sql в пакете dacpac? Согласно моему тесту, когда я разархивирую файл .dacpac, он содержит только файлы XML.
Попробуйте добавить аргумент: /p:ExtractTarget=File
в команду sqlpackage. Например: ./sqlpackage/sqlpackage /Action:Extract /SourceServerName:$(sqlServerName) /SourceDatabaseName:$(sqlDatabaseName) /TargetFile:$(Build.SourcesDirectory)/temp/DACPAC/$(sqlDatabaseName).dacpac /AccessToken:$accessToken /p:ExtractTarget=File
В этом случае файл dacpac будет содержать файл sql.
Из сценария 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
С какими проблемами вы столкнулись при запуске скрипта? Можете ли вы поделиться более подробной информацией?