SQL 2008 FILESTREAM - 如何在更改数据库之前检查数据库是否启用了文件流

时间:2011-04-18 19:11:46

标签: sql tsql sql-server-2008 sql-server-2008-r2

在我的情况下,脚本可能会多次运行(不要问为什么)。

所以我想在prod运行之前让我的脚本子弹证明。

我在添加FILESTREAM功能方面有了很大的改变。通过启用FILESTREAM,更改数据库以添加文件流文件组,然后将文件位置添加到该文件组,最后在数据上创建包含文件流的表,我已经使用必要的脚本在我的开发环境中工作了column(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 /文件路径?请有人帮忙。我只是想围绕它做另一个if声明。

2 个答案:

答案 0 :(得分:3)

要查看您是否已在sys.data_spaces查看FILESTREAM的文件组:

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

要查看文件组是否有任何FILESTREAM文件,请查看sys.database_files

select * from sys.database_files where type = 2;

无论你做什么,依赖于对象名称

答案 1 :(得分:1)

或者从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