要在DB 3上使用Filestream,必须执行以下步骤:
1)启用服务器/实例级别
2)在数据库级别启用它(sp_configure
3)创建支持文件流的varbinary(max)
字段
(2)和(3)
(1)可以从SQL Server配置管理器手动完成,基本上我需要检查所有3个复选框:
但如何自动化呢?
我发现这个artcile "Enabling filestream usin a VBScript",有没有比使用VBScripts更好的方法呢?可能只有2008R2可以做的事情吗?
如果VBScript是唯一的解决方案,那可能是缺点?
答案 0 :(得分:5)
除了单击配置管理器之外,唯一的方法是通过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);
}
}
答案 1 :(得分:3)
跑吧。
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://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
祝你好运!
答案 2 :(得分:1)
Pawel的解决方案对我们很有用。我们使用VBS看到了50%的失败率 - Pawel的方法还没有看到失败。与Greg的结果不同,它对我们来说非常适合本地系统。实际上,这就是我们尝试过的所有内容。
我们确实需要对Pawel的代码进行一些调整。这条线
throw new FilestreamConfigurationException("Result of calling filestreamSettingsObject.InvokeMethod(\"EnableFilestream\", methodArgs, null)" is null);
最终引用字符不合适。它应该在“is null”之后,就在“);”之前。
我们还必须确保正确构建了instanceName。例如,如果我们有“mymachine \ myinstance”,我们必须确保“instanceName = myinstance”而不是全名。此外,如果我们有“mymachine”(默认实例),我们必须有“instanceName = MSSQLSERVER”。也许这就是Greg的问题 - 当我们将instanceName设置为错误时,我们得到的结果与Greg报告相同。