2010-05-31 26 views
1

要在DB 3上使用Filestream,必须执行以下步骤:SQL Server安装后是否有使用VBScript启用FileStream的替代方法?

1)启用服务器/实例级别

2)在DB级别启用它(sp_configure

3)创建varbinary(max)字段支持文件流

(2)和(3)可以通过T-SQL轻松完成

(1)可以从SQL Server配置管理器手动完成,基本上我需要检查所有3个复选框:

alt text http://www.sql-server-performance.com/admin/article_images_new/2008_images/Configure_Filestream_in_SQL_Server_2008/Image2.jpg

但是如何自动化呢?

我发现这个artcile "Enabling filestream usin a VBScript",有没有比使用VBScripts更好的方法呢?可能只有2008R2可以做的事情?

如果VBScript是唯一的解决方案,可能的缺点是什么?

+0

你似乎找到了一个脚本来做你想做的事情。为什么不适合? – 2010-05-31 09:18:11

+0

是的,我找到了脚本,但我希望搜索替代品,因为我实现了所有系统而不使用VBScripts,所以如果我可以在不使用VBScript的情况下实现相同的效果,我会更开心。 – LaBracca 2010-05-31 09:45:18

+0

将filestream访问级别设置为2,您将为transact_sql和I/O流式访问设置filestream enable,如我在答案中所写。你还需要什么? – hgulyan 2010-05-31 09:47:20

回答

4

除了单击配置管理器之外,唯一的方法是通过WMI(这是VBScript所做的)。如果你不喜欢VB,这里是如何我已经从C#配置它(请注意,代码需要使用管理员权限(高架运行)):

private ManagementObject GetFilestreamManagementObject(string machineName, string instanceName) 
{ 
    string managementPath = string.Format(@"\\{0}\root\Microsoft\SqlServer\ComputerManagement10", machineName); 
    ManagementScope managementScope = new ManagementScope(managementPath); 
    managementScope.Connect(); 

    SelectQuery query = new SelectQuery("FilestreamSettings", string.Format("InstanceName='{0}'", instanceName)); 
    using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(managementScope, query)) 
    { 
     ManagementObjectCollection moc = searcher.Get(); 
     if (1 != moc.Count) 
     { 
      string exceptionText = String.Format("Expected single instance of FilestreamSettings WMI object, found {0}.", moc.Count); 
      throw new FilestreamConfigurationException(exceptionText); 
     } 
     ManagementObjectCollection.ManagementObjectEnumerator enumerator = moc.GetEnumerator(); 
     if (false == enumerator.MoveNext()) 
     { 
      throw new FilestreamConfigurationException("Couldn't move ManagementObjectEnumerator to the first entry."); 
     } 
     return (ManagementObject)enumerator.Current; 
    } 
} 

private void EnableFilestream(int accessLevel) 
{ 
    ManagementObject filestreamSettingsObject = GetFilestreamManagementObject("myMachine", "MSSQLSERVER"); 
    ManagementBaseObject methodArgs = filestreamSettingsObject.GetMethodParameters("EnableFilestream"); 
    methodArgs["AccessLevel"] = accessLevel; 
    methodArgs["ShareName"] = ""; //default 

    ManagementBaseObject returnObject = filestreamSettingsObject.InvokeMethod("EnableFilestream", methodArgs, null); 
    if (returnObject == null) 
    { 
     throw new FilestreamConfigurationException("Result of calling filestreamSettingsObject.InvokeMethod(\"EnableFilestream\", methodArgs, null)" is null); 
    } 
    uint returnValue = (uint)returnObject.GetPropertyValue("ReturnValue"); 

    const uint errorSuccessRestartRequired = 0x80070BC3; 
    if (returnValue != 0 && returnValue != errorSuccessRestartRequired) 
    { 
     Win32Exception win32Exception = new Win32Exception((int)returnValue); 
     string exceptionText = 
       string.Format("'EnableFilestream' method returned {0}: {1}", returnValue, win32Exception.Message); 
     throw new FilestreamConfigurationException(exceptionText); 
    } 
} 
+0

另外:使用System.Management添加;并右键单击引用并添加System.Management – maniac 2017-03-21 15:58:24

2

只要运行这个。

USE master 
Go 
EXEC sp_configure 'show advanced options' 
GO 
EXEC sp_configure filestream_access_level, 3 
GO 
EXEC sp_filestream_configure 
    @enable_level = 3 
, @share_name = N'FS'; 
GO 
RECONFIGURE WITH OVERRIDE 
GO 

更多内容

http://www.mssqltips.com/tip.asp?tip=1489

0 =禁止(这是默认值)启用

1 =仅用于T-SQL访问

2 =允许用于T-SQL访问和本地 文件系统访问

3 =为T-SQL访问启用,本地 文件系统访问和远程文件 系统访问

可以存储脚本在存储过程,并从应用程序中调用它或任何你想。关于这一主题

我这里还有链接

http://www.mssqltips.com/tip.asp?tip=1838

http://blogs.msdn.com/b/sqlserverstorageengine/archive/2008/03/03/filestream-configuration-and-setup-changes-in-sql-server-2008-february-ctp.aspx

http://technet.microsoft.com/en-us/library/cc645923.aspx

http://www.sql-server-performance.com/articles/dba/Configure_Filestream_in_SQL_Server_2008_p1.aspx

编辑

回应您的评论。

这就是我所说的第2步

CREATE DATABASE Archive 
ON 
PRIMARY (NAME = Arch1, 
    FILENAME = 'c:\data\archdat1.mdf'), 
FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM(NAME = Arch3, 
    FILENAME = 'c:\data\filestream1') 
LOG ON (NAME = Archlog1, 
    FILENAME = 'c:\data\archlog1.ldf') 
GO 

http://technet.microsoft.com/en-us/library/cc645585.aspx

检查链接的所有步骤

Filestream in Sql Server 2008 Express

祝您好运!

+0

你的建议是我所说的步骤(2),我需要步骤(1)。我还在我的问题中添加了一个图像,使其更加明确我想要自动化的东西。 – LaBracca 2010-05-31 09:46:17

+0

@ user193655检查更新 – hgulyan 2010-05-31 09:50:47

+0

是的,但在此步骤之前,必须在配置管理器中启用文件流。这是我想要自动化的部分。 – LaBracca 2010-05-31 10:07:50

1

帕维尔的解决方案为我们伟大的工作。我们发现使用VBS的失败率高达50% - 并没有看到Pawel的方法失败。与格雷格的结果不同,它对我们来说非常适合本地系统。其实,这就是我们一直在尝试的。

我们确实需要对Pawel的代码进行一些调整。该行

throw new FilestreamConfigurationException("Result of calling filestreamSettingsObject.InvokeMethod(\"EnableFilestream\", methodArgs, null)" is null); 

具有不合适的最终引号字符。它应该在“之后”之前,在“之前”);“。

我们还必须确保我们正确地构建了instanceName。例如,如果我们有“mymachine \ myinstance”,我们必须确保“instanceName = myinstance”而不是全名。此外,如果我们有“mymachine”(默认实例),则必须具有“instanceName = MSSQLSERVER”。也许这就是Greg的问题 - 当我们将instanceName设置为错误的东西时,我们得到了Greg报告的相同结果。

相关问题