Ошибка сборки Red Gate SQL CI: файловая группа FILESTREAM недоступна в базе данных

TL;DR Поддерживает ли SQLCI FILESTREAM?

Я получаю сообщение об ошибке Synchronization of 'Scripts.state' and ... failed: Default FILESTREAM filegroup is not available in database при попытке запустить этап сборки Red Gate SQL CI в TeamCity для моей базы данных, которая включает столбцы FILESTREAM.

Мой источник правды — SQL Source Control, поддерживаемый Git. Я использую экземпляр SqlServer 2012, а не LocalDB для проверки из-за других ошибок. На этом сервере есть и другие базы данных с содержимым FILESTREAM, поэтому я не думаю, что проблема связана с ограничениями функций.

Кто-нибудь сталкивался с этой проблемой раньше?

Полный список ошибок

(Анонимизировано *)

    [Step 1/2] Disabled build step database (Red Gate (SQL Server)) is skipped
    Step 2/2: Red Gate SQL CI Build (Red Gate SQL CI Build) (3m:07s)
    [Step 2/2] Starting: C:\BuildAgent\plugins\sqlci-teamcity-agent\assets\sqlCI.exe build /temporaryDatabaseUserName=******** /temporaryDatabaseServer=*********** /scriptsFolder=SqlSourceControl /packageId=*********** /packageVersion=423
    [Step 2/2] in directory: C:\BuildAgent\work\fbc3771fbc95579a
    [Step 2/2] sqlCI.exe -- Red Gate's SQL Continuous Integration v2.1.1.1028
    [Step 2/2] 
    [Step 2/2] Creating scratch database sqlCI_ac1a4566-1268-47ee-a255-a0c7e751511c (1s)
    [Creating scratch database sqlCI_ac1a4566-1268-47ee-a255-a0c7e751511c] STARTING: Creating scratch database sqlCI_ac1a4566-1268-47ee-a255-a0c7e751511c
    [Creating scratch database sqlCI_ac1a4566-1268-47ee-a255-a0c7e751511c] COMPLETED SUCCESSFULLY: Creating scratch database sqlCI_ac1a4566-1268-47ee-a255-a0c7e751511c
    [Step 2/2] Validating database state (2m:46s)
    [Validating database state] STARTING: Validating database state
    [Validating database state] Starting: C:\BuildAgent\plugins\sqlci-teamcity-agent\assets\SC\SQLCompare.exe /include="Identical" /include="StaticData" /scripts1="C:\BuildAgent\temp\buildTmp\tbudqiij.eej\db\state" /server2="**.**.**.**" /database2="sqlCI_ac1a4566-1268-47ee-a255-a0c7e751511c" /username2="******" /password2=****** /synchronize /options="DecryptPost2KEncryptedObjects,IgnoreFillFactor,IgnoreWhiteSpace,IncludeDependencies,IgnoreFileGroups,IgnoreUserProperties,IgnoreWithElementOrder,IgnoreDatabaseAndServerName,UseMigrationsV2"
    [Validating database state] SQL Compare: in trial, expires 2015/06/18 15:03:41 +01:00
    [Validating database state] Automation License: in trial, expires 2015/06/18 15:03:41 +01:00
    [Validating database state] SQL Compare Command Line V11.2.0.22
    [Validating database state] ==============================================================================================================================================================
    [Validating database state] Copyright Copyright ¸ 1999 - 2015 Red Gate Software Ltd
    [Validating database state] 
    [Validating database state] Registering data sources
    [Validating database state] Creating mappings
    [Validating database state] Comparing
    [Validating database state] 
    [Validating database state] Applying Command Line Items
    [Validating database state] 
    [Validating database state] Checking for identical databases
    [Validating database state] Creating SQL
    [Validating database state] Inserting static data SQL into deployment script
    [Validating database state] Deploying changes (from DB1 to DB2)
    [Validating database state] Error: Synchronization of 'Scripts.state' and '172.16.1.202.sqlCI_ac1a4566-1268-47ee-a255-a0c7e751511c' failed: Default FILESTREAM filegroup is not available in
    [Validating database state] database 'sqlCI_ac1a4566-1268-47ee-a255-a0c7e751511c'. Error executing the following SQL: CREATE TABLE [dbo].[tbl_************] ( [*******ID] [int] NOT NULL
    [Validating database state] IDENTITY(1, 1) NOT FOR REPLICATION, [******Name] [nvarchar] (250) COLLATE Latin1_General_CI_AS NULL, [*******Type] [nvarchar]...
    [Validating database state] ##teamcity[buildStatus status='FAILURE' text='Validating database state failed with error: SQLCompare failed with exit code 126: see output above for more information, or for generic information about this exit code, see: http://www.red-gate.com/sqlCI/ExitCodes/SQLCompare']
    [Validating database state] FINISHED WITH ERROR: Validating database state
    [Step 2/2] ##teamcity[buildStatus status='FAILURE' text='Running SQLCompare failed with error: SQLCompare failed with exit code 126: see output above for more information, or for generic information about this exit code, see: http://www.red-gate.com/sqlCI/ExitCodes/SQLCompare']
    [Step 2/2] Process exited with code 32
    [Step 2/2] Step Red Gate SQL CI Build (Red Gate SQL CI Build) failed

Расследования

Запустив трассировку SQL, мне удалось вытащить сетевой кабель как раз перед тем, как база данных была автоматически удалена после сбоя.

Основываясь на ответе @DevOps, я смог определить, что SQLCI не создавал файловую группу FILESTREAM в базе данных. Создав его вручную, CREATE TABLE удалось добиться успеха.

Мне еще не удалось заставить SQLCI выполнять этот шаг автоматически.


person Andy Joiner    schedule 21.05.2015    source источник


Ответы (2)


С Redgate SQL CI это создает новую БД с уникальным именем как часть процесса сборки. Похоже, что в базе данных не включен FILESTREAM перед попыткой создать таблицу со столбцом FILESTREAM, даже если эта функция включена на сервере. Должен быть какой-то сценарий для настройки FILESTREAM для базы данных, поэтому с помощью простого запроса мы могли бы проверить это, при условии, что впоследствии он не разорвал базу данных.

SELECT database_id, type_desc, name, physical_name
FROM sys.master_files WHERE database_id = DB_ID('StreamTestDb')

OR

SELECT 1 from sys.database_files where name = 'LogicalFileName'

Используете ли вы SQL Source Control для создания сценария базы данных или SSDT? У меня также есть полный конвейер CI с Regadate DLM, поэтому я посмотрю, смогу ли я воспроизвести эту проблему, но похоже, что это не сценарий настройки FILESTREAM.

e.g.

ALTER DATABASE StreamTestDb
ADD FILEGROUP [StreamTestFileStreamGroup1]
CONTAINS FILESTREAM
GO
ALTER DATABASE StreamTestDb
ADD FILE
(
    NAME = N'StreamTestFileStreamGroup1File',
    FILENAME = N'D:\PATH\FSDATA'
)
TO FILEGROUP [StreamTestFileStreamGroup1]
GO
person Evolve Software Ltd    schedule 22.05.2015
comment
Спасибо! Я проверю это сейчас. Я использую SQL Source Control, поддерживаемый GIT, и я надеюсь получить полный конвейер CI с помощью Redgate DLM. - person Andy Joiner; 22.05.2015
comment
Запустив трассировку, мне удалось вытащить сетевой кабель как раз перед тем, как база данных была автоматически удалена после сбоя. Никаких результатов для первых 2 запросов, но после выполнения последнего запроса я мог вручную запустить захваченный ошибочный оператор CREATE TABLE, поэтому я думаю, что вы правы в том, что SQLCI не записывает в сценарий настройку FILESTREAM. p.s. опечатка в FILESTERAM - person Andy Joiner; 22.05.2015

На основании этого сообщения на форуме

  • Создать временную базу данных
  • Создайте FileGroup во временной базе данных
  • Specify "Temporary database name" in the build step in TeamCity
    • (Effectivley renders the /temporaryDatabaseName in the TeamCity runner)

Примечание. Возможно, вам придется удалить и заново создать базу данных на более раннем этапе сборки - похоже, я не смогу повторно использовать ее.

person Andy Joiner    schedule 21.08.2015