今天想对数据库的登录名作相应的权限调整,即赋予登录名yangjin在服务器级别上的查看任何定义的权限,如下图所示:
然后点击确定之后,却报了如下的错误:
一番思考之后,然后在网上查找资料,找出查询服务器信息的几个语句如下:
select @@SERVERNAME
SELECTSERVERPROPERTY('ServerName')
这一查,看到了返回结果不一样,在结合报错,服务器属性必须等于实际的服务器名称,感觉有了点眉目,可能就是因为上述两个参数不一致的原因导致的。然后就去查这两个语句的具体意思,有如下发现:
1. @@SERVERNAME:
返回运行 Microsoft® SQLServer™ 的本地服务器名称。
SQL Server 安装程序在安装时将服务器名设置为计算机名。可通过使用 sp_addserver 然后重新启动 SQL Server 来更改 @@SERVERNAME。不过,通常不需要这种方法。
2. SERVERPROPERTY('ServerName'):
Windows NT 服务器和与指定的 SQLServer 实例关联的实例信息。如果输入无效或发生错误,则返回 NULL。
注释:
1. SERVERPROPERTY 函数的 ServerName 属性与 @@SERVERNAME 返回相似的信息。ServerName 属性提供 Windows NT 服务器和实例名称,两者共同构成唯一的服务器实例。@@SERVERNAME提供当前配置的本地服务器名称。
如果安装时未更改默认服务器名称,则 ServerName 属性和 @@SERVERNAME 返回相同的信息。通过执行 sp_addserver 和 sp_dropserver 可以配置本地服务器名称。
如果在安装时已将本地服务器名称从默认服务器名称更改成其它名称,则 @@SERVERNAME 返回更改后的新名称。
2. 尽管 @@SERVERNAME 函数和 SERVERPROPERTY 函数的 SERVERNAME 属性可能返回相似格式的字符串,但信息会有所不同。SERVERNAME 属性会自动报告计算机网络名的更改。
相比之下,@@SERVERNAME 不报告此更改。@@SERVERNAME 报告使用 sp_addserver 或 sp_dropserver 存储过程对本地服务器名所做的更改。
然后查看了一下,数据库服务器的计算机名为:
然后询问了我们公司的运维组人员得知iZ2387thvdiZ这个是以前的计算机名,之后更改了计算机名为上图所示的,这下刚好符合注释2提到的SERVERNAME 属性会自动报告计算机网络名的更改,@@SERVERNAME 不报告此更改。
知道问题所在之后,就去解决问题,即将@@SERVERNAME调整为与SERVERNAME 属性一致,方法为注释2提到的用 sp_addserver 或 sp_dropserver 存储过程对本地服务器名所做的更改,然后重启服务器。
具体代码如下:
sp_dropserver'iZ2387thvdiZ', null
sp_addserver'TESTONLINESERVE' ,'LOCAL',null
然后重启数据库服务;
再执行查询:
select @@SERVERNAME
SELECTSERVERPROPERTY('ServerName')
这时候结果一致了,然后我们在回到最初的目的,进行权限设置:
最终大功告成!如下
图:
总结:在给进行服务器级别的授权时,安全对象默认读取本地服务器名称即@@SERVERNAME;正常情况在安装sql server 实例时,如果未更改默认服务器名称,则@@SERVERNAME与数据库服务器的计算机名一致。而SERVERPROPERTY('ServerName')则为计算机名。但是SERVERNAME 属性会自动报告计算机网络名的更改,@@SERVERNAME 不报告此更改。所以当我们在安装完sql server 实例之后更改计算机名,@@SERVERNAME不会更改还是原来的值,而SERVERPROPERTY('ServerName')会随之变为更改之后的计算机名,所以会报文章开头的错误。
在尝试为SQL Server登录名授权时遇到错误,原因是@@SERVERNAME与SERVERPROPERTY('ServerName')返回的服务器名称不一致。通过查询资料和服务器信息,发现服务器名称在安装后被更改,导致两者信息不同。通过执行sp_addserver和sp_dropserver存储过程调整@@SERVERNAME,使其与SERVERPROPERTY一致,然后成功完成权限设置。
1172





