SQL 2008 FILESTREAM - Как проверить, включен ли файловый поток в БД перед его изменением - PullRequest
2 голосов
/ 18 апреля 2011

В моей ситуации существует возможность многократного запуска сценария (не спрашивайте почему).

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

У меня довольно большое изменение, когда я добавляю возможности FILESTREAM. Я уже заставил его работать в моей среде разработки с необходимыми сценариями, включив FILESTREAM, изменив базу данных для добавления файловой группы файлового потока, а затем добавив местоположение файла в эту файловую группу и, наконец, создав таблицу с файловым потоком на данных столбец (varbinary (MAX)).

Это все хорошо. Но многократный запуск сценария ALTER DATABASE может привести к ошибкам, если файловая группа уже существует. Итак, я сделал это ...

IF NOT EXISTS (SELECT * FROM sys.filegroups WHERE [name]='NewFileGroup')
    BEGIN
        ALTER DATABASE [MyDb]
        ADD FILEGROUP [NewFileGroup] CONTAINS FILESTREAM
    END 
GO

Но следующая часть кода - это та часть, которую я не хочу запускать много раз ...

DECLARE @Path NVARCHAR(MAX)
SET @Path = (SELECT REPLACE(filename, 'MyDb.mdf', 'NewFileGroup') FROM sysfiles WHERE Name = 'PrimaryFileName')

DECLARE @SQL NVARCHAR(max)

SET @SQL = 
'ALTER DATABASE [MyDb]
ADD FILE
  (NAME = ''NewFileGroup''
   , FILENAME = ' + QuoteName( @Path, '''' ) 
            + ')
TO FILEGROUP [NewFileGroup]'

EXEC(@SQL)

Этот код работает нормально, но как я могу проверить, существует ли путь FILENAME / file в этой файловой группе? Пожалуйста, помогите кому-нибудь. Я просто хочу сделать еще одно заявление об этом.

Ответы [ 2 ]

4 голосов
/ 18 апреля 2011

Чтобы узнать, есть ли у вас файловая группа для FILESTREAM, посмотрите в sys.data_spaces:

select * from sys.data_spaces where type='FD';

Чтобы узнать, есть ли в файловой группе какой-либо файл для FILESTREAM, посмотрите: sys.database_files:

select * from sys.database_files where type = 2;

Что бы вы ни делали, не полагайтесь на объект names .

1 голос
/ 10 ноября 2014

Или из SQL Server 2012 и выше в этом запросе будут перечислены все базы данных, для которых разрешен нетранзакционный доступ, т.е. FileStream.

SELECT DB_NAME(database_id) [DB_Name],directory_name [FileStream_DirectoryName]
    FROM  sys.database_filestream_options
    WHERE non_transacted_access != 0;    

Подробнее см. http://msdn.microsoft.com/en-us/library/gg492071.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...