我正在尝试创建一个数据库,但一旦创建,我无法连接到它。
服务器是Microsoft SQL Server 2008并使用.Net 4.5。我们正在使用SMO创建数据库,但我们通常使用Dapper来连接和查询数据库。
这是我到目前为止的代码,它有效:
System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(connectionString);
Microsoft.SqlServer.Management.Smo.Server srv = new Microsoft.SqlServer.Management.Smo.Server(new Microsoft.SqlServer.Management.Common.ServerConnection(con));
var database = new Microsoft.SqlServer.Management.Smo.Database(srv, dbName);
database.Create(false);
database.Roles["db_datareader"].AddMember(???);
database.Roles["db_datawriter"].AddMember(???);
database.Roles["db_backupoperator"].AddMember(???);
srv.Refresh();
N ???
?我试过了
System.Environment.UserDomainName + "\\" + System.Environment.UserName
和
System.Environment.UserName
但它失败了(更新),错误Add member failed for DatabaseRole 'db_datareader'.
包含两个值。
问题在于,当我创建数据库时,由于某些原因(使用Dapper),我无法从同一程序中将其连接到它。 (更新)我收到错误消息:Cannot open database \"<database_name>\" requested by the login. The login failed.\r\nLogin failed for user '<domain>\\<username>'
(其中<database_name>
是数据库名称,<domain>
我的登录域,<username>
我的Windows登录)。
我错过了什么吗?我做对了吗?我试过在网上搜索,但似乎没有人用这种方式创建数据库。方法在那里,它应该工作,不是吗?
** 更新 **
如果我对database.Roles["..."].AddMember(...)
行进行评论,并在srv.Refresh()
添加断点,那么从那里恢复程序就可以解决所有问题。
为什么断点能解决所有问题?我不能只是在生产中破坏程序......也不能在每次创建数据库时破坏程序。
答案 0 :(得分:1)
听起来Dapper连接问题是SQL Server异步执行某些SMO操作的问题。很可能,新数据库不能立即为其他用户/连接做好准备,但SQL Server需要一些时间来准备它。在“人工时间”(在SSMS中,或在断点中),这是不明显的,但“程序时间”太快,所以你可能需要暂停。
这个可能也是角色AddMember
的问题,但是这里有很多可能有问题的东西,而且我们没有足够的信息可讲。 (具体来说,AddMember
稍后会工作吗?并且正确传递的字符串是否正确?)
答案 1 :(得分:0)
这种情况正在发生,因为您已为该用户创建了用户,但没有登录。虽然我不知道确切的语法,但您必须创建Login
。您需要将其LoginType
设置为LoginType.WindowsUser
。此外,您可能需要将WindowsLoginAccessType
设置为WindowsLoginAccessType.Grant
,然后您需要通过构建一个来设置Credential
,可能是NetworkCredential
用户名想。
要对此进行直观显示,Login
位于Management Studio中Security
的{{1}}节点下,而Server
位于User
下Security
的节点。两者都需要存在才能访问SQL Server。