SQL Server 的用户安全管理分两层,整个SQL Server 服务器一层,每个数据库一层。
- 在服务器层的帐号,叫登录账户(),可以设置它管理整个SQL Server服务器(开启跟踪,修改 Sql Server 安全配置,备份所有数据库等)。
- 在数据库一层,叫数据库账户(),可以设置它对这个特定的数据库有读写、修改表结构、存储过程定义等权限。
登录帐号对于服务器而言的,数据库用户是针对特定数据库来讲的。就相当于一个房间里放着很多保险柜,你有房门钥匙了,必须得有每个保险柜的钥匙才能从保险柜里取东西。登录帐户是房门钥匙,数据库用户是保险柜钥匙。
1. 什么是孤立用户
如上述所述“登陆账户”和“数据库账户”之间存在一层映射,如果数据库“A”中有账户“cms”,但没有“登陆账户”与其对应,那么“cms”账户就无法连接SQL Server服务,因此它就没有任何作用,便成立一个孤立的用户。
2. 什么情况下会产生孤立用户
第一个服务器的情况:
- 数据库A
- 数据库A中有cms账户,并且也存在cms登陆账户
在第一个服务器中备份数据A,并在第二个服务器中还原该数据库,那么第二个服务器的情况:
- 数据库A
- 数据库A中有cms账户,不存在与其对应的登陆账户
此时在第二个服务器的数据库A中便产生了孤立账户cms,在第二个服务器中运行下述语句也可看到孤立账户cms:
Use Aexec sp_change_users_login 'report'
如果直接建立登陆账户“cms”,并制定其“数据库访问”为数据库A,会提示“用户**已存在”,如下图:
3. 如何解决孤立用户
解决孤立账户实质上就是建立一个“登陆账户”,并关联“登陆账户”和“数据库账户”。
建立一个登陆账户(一般与孤立账户同名,即“cms”),先不设置该“登陆账户”的数据库访问和数据角色,并设置该“登陆账户”的密码(一般也与孤立账户相同),然后连接“登陆账户”和“数据库账户”。
Use Aexec sp_change_users_login 'update_one', 'cms', 'cms'
这样在执行“exec sp_change_users_login 'report'”就不会看到孤立账户“cms”了。
sp_change_users_login的语法
exec sp_change_users_login 'update_one', '登陆账户名', '数据库账户名'
注意:“登陆账户”的账户名和密码都可以和“孤立账户”不同,应用程序的数据库配置应当为“登陆账户”的账户名和密码,而不是“数据库账户”。
4. 另一种解决办法
假设数据A中存在孤立账户cms,其密码为“123456”,应用程序的数据库配置也是此。为了能够使得应用程序能够正常使用,可以做如下操作:
- 建立登陆账户“cms”,并设置密码和默认数据库分别为123456、cms
- 设置该登陆账户的“服务器角色”为“System Administrators”
- 不为该登陆账户设置相关“数据库访问”属性
- 保存时会提示如下错误,不必理会
这种方法仅仅是建立了一个类似于sa的cms用户,虽能够保障应用程序正常使用,但并不能解决孤立用户。