我有C#编写的Windows服务,它将自己安装为 ServiceAccount.LocalSystem
并在MSSQLSERVER
中指定ServicesDependedOn
。
现在我已经创建了MS SQL用户,授予它所有必要的权限&角色(包括所需数据库上的db_owner
和连接/登录权限)。
当手动运行服务(通过net start
或 services.msc 管理器)时,它会正常工作,即它连接到数据库。
当我重新启动机器时,服务会抛出此异常:
Cannot open database "xxxx" requested by the login. The login failed.
Login failed for user 'xxxxx'.
我配置错误了什么?再次,当我手动运行服务时,它工作正常!!
我也尝试通过MS SQL Management Studio登录此帐户 - 这也有效。
正如评论中所建议的,我在尝试连接之前尝试过等待 - 20秒睡眠无法解决问题。我将MSSQLSERVER服务的状态(通过ServiceController检查)添加到日志中,它是“正在运行”。一切似乎都很好,除了在服务自动启动时登录失败
好的,我已经跟踪了几个小时了。 这是我发现的:
SQL Server 服务(MSSQLSERVER)声称已准备就绪(状态=已启动)非常快(发出“net start”命令后约2-3秒)。不幸的是,热身(启动数据库,恢复和其他一些东西)发生稍后,需要2分钟(120秒!!)。当然,它会在连接热情之前拒绝连接。
我最终做了
try
{
connect;
} catch {
RequestAdditionalTime(); // to avoid Windows Service timeout
Sleep();
}
在while
循环中。
我讨厌这种解决方案但找不到更清洁的东西。
如果有人知道怎么做,请回答。
答案 0 :(得分:1)
对我有用的唯一解决方案是不中继服务状态,只是重试每个~10秒连接到服务器。
答案 1 :(得分:1)
您可以使用上述方法连接到master并调用以下
select state, databases.state_desc ,* from sys.databases
/*
0 = ONLINE
1 = RESTORING
2 = RECOVERING
SQL Server 2008 through SQL Server 2014
3 = RECOVERY_PENDING
SQL Server 2008 through SQL Server 2014
4 = SUSPECT
5 = EMERGENCY
SQL Server 2008 through SQL Server 2014
6 = OFFLINE
SQL Server 2008 through SQL Server 2014
7 = COPYING
Azure SQL Database
10 = OFFLINE_SECONDARY
Azure SQL Database
*/

或另一种方法是调用以下检查非NULL值,注意除非数据库完全就绪,否则应该返回NULL。
SELECT DATABASEPROPERTYEX(' MyDatabaseName',' Collation')