Sql Server中的用户名和登录名

 更新时间:2014年01月12日 11:09:39   投稿:zxhpj  
Sql Server中的用户名和登录名或服务器账号搞迷糊,虽然用sa(登录名)就搞定一切东西了,当然这会存在一些安全隐患

登录名
服务器方的一个实体,使用一个登录名只能进入服务器,但是不能让用户访问服务器中的数据库资源。每个登录名的定义存放在 master 数据库的 syslogins 表中

用户名
一个或多个登录对象在数据库中的映射,可以对用户对象进行授权,以便为登录对象提供对数据库的访问权限。用户定义信息存放在每个数据库的 sysusers 表中。

SQLSERVER把登录名与用户名的关系称为映射。
用登录名登录SQLSERVER后,在访问各个数据库时,SQLSERVER会自动查询此数据库中是否存在与此登录名关联的用户名,若存在就使用此用户的权限访问此数据库,若不存在就是用guest用户访问此数据库(guest是一个特殊的用户名,后面会讲到)。

一个登录名可以被授权访问多个数据库,但一个登录名在每个数据库中只能映射一次。即一个登录可对应多个用户,一个用户也可以被多个登录使用。好比SQLSERVER就象一栋大楼,里面的每个房间都是一个数据库.登录名只是进入大楼的钥匙,而用户名则是进入房间的钥匙.一个登录名可以有多个房间的钥匙,但一个登录名在一个房间只能拥有此房间的一把钥匙。

链接或登录Sql Server服务器时是用的登录名而非用户名登录的,程序里面的链接字符串中的用户名也是指登录名。
SQLSERVER中有几个特殊的登录名和用户名:

我们常见的dbo(用户名)是指  以sa(登录名)或windows   administration(Windows集成验证登录方式)登录的用户,也就是说数据库管理员在SQLSERVER中的用户名就叫dbo,而不叫 sa,这一点看起来有点蹊跷,因为通常用户名与登录名相同(不是强制相同,但为了一目了然通常都在创建用户名时使用与登录名相同的名字),

例如创建了一个登录名称为me,那么可以为该登录名me在指定的数据库中添加一个同名用户,使登录名me能够访问该数据库中的数据.当在数据库中添加了一个用户me 后,之后以me登录名登录时在该数据库中创建的一切对象(表,函数,存储过程等)的所有者都为me,如me.table1,me.fn_test(),而不是dbo.table1,dbo.fn_test().

SQL Server中还有一个特殊的数据库角色public,它存在于每一个数据库中,包括系统数据库,如master、msdb、model和用户数据库,数据库的所有用户都属于public角色,并且不能从public角色中删除。

在SQLSERVER数据库中,guest帐户是特殊的用户帐户。如果用户使用USE database语句访问的数据库中没有与此用户关联的帐户,此用户就与guest用户相关联。 

另外SQLSERVER采取登录名-用户名的安全规则,和Oracle里面的schema有点像。SQLSERVER使用所有者进行限定(类似于Oracle中的schema),是因为不同的用户可能创建同名的对象,  例如登录名me和登录名you在pubs数据库中分别创建了用户名me和you,这二个用户都创建了testtable这个同名表,而这二个表虽然同名但结构或数据可能完全不同,为了避免调用错误,必须使用所有者名称进行限定.

如何来调用别的用户创建的对象呢?  例如me用户访问you用户创建的表或访问dbo创建的表. 此种情况,必须同时满足二个条件: 

1. 将me用户的数据库角色设置为db_owner,否则无法访问其他用户(包括dbo用户)创建的对象.(企业管理器-> 用户,右键菜单 <属性> 中设置)  :

2. 使用所有者进行限定. 
例如用户me访问用户you创建的testtable: 
select   *   from   you.testtable 
另外, dbo用户作为管理员,系统赋予其所有的权限,可以调用任何用户创建的对象. 
若某个数据库存在2个或2个以上的用户名,如果具有db_owner角色的用户在访问对象时省略了所有者,则系统先查找该用户的对象,若找不到则查找dbo用户是否有同名对象.例如: 
select   *   from   testtable     或 
select   *   from   pubs..testtable

相关文章

  • SQLServer中排查死锁及死锁问题解决

    SQLServer中排查死锁及死锁问题解决

    在并发访问数据库的环境中,死锁是一个常见的问题,本文主要介绍了SQLServer中排查死锁及死锁问题解决,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • MSSQL优化之探索MSSQL执行计划(转)

    MSSQL优化之探索MSSQL执行计划(转)

    最近总想整理下对MSSQL的一些理解与感悟,却一直没有心思和时间写,晚上无事便写了一篇探索MSSQL执行计划,本文讲执行计划但不仅限于讲执行计划
    2011-10-10
  • sql查询结果列拼接成逗号分隔的字符串方法

    sql查询结果列拼接成逗号分隔的字符串方法

    SQL查询时会经常需要,把查询的结果拼接成一个字符串。那么怎么直接把sql查询结果列拼接成逗号分隔的字符串方法,下面就一起来了解一下
    2021-05-05
  • Sql Server 分组统计并合计总数及WITH ROLLUP应用

    Sql Server 分组统计并合计总数及WITH ROLLUP应用

    WITH ROLLUP 在生成包含小计和合计的报表时,ROLLUP 运算符很有用,ROLLUP 运算符生成的结果集类似于 CUBE 运算符所生成的结果集,接下来介绍Sql Server 分组统计并合计总数实现代码,感兴趣的朋友可以了解下哦
    2013-01-01
  • 没有sa密码无法集成windows身份验证登录的解决方法

    没有sa密码无法集成windows身份验证登录的解决方法

    以前都是通过windows集成身份验证登录进去的(sa密码早忘记了),今天就改了服务器的机器名,现在无论如何都登录不进去,下面是解决方法
    2014-01-01
  • mssql server .ldf和.mdf的文件附加数据库的sql语句

    mssql server .ldf和.mdf的文件附加数据库的sql语句

    mssql server .ldf和.mdf的文件附加数据库的sql语句...
    2007-07-07
  • SQL Server日志清理3种实现方式

    SQL Server日志清理3种实现方式

    这篇文章主要给大家介绍了关于SQL Server日志清理3种实现方式的相关资料,在数据库使用很久后日志文件会累计的越来越大,如果硬盘空间不足可能会导致宕机,需要的朋友可以参考下
    2023-09-09
  • sql server如何去除数据中的一些无用的空格

    sql server如何去除数据中的一些无用的空格

    这篇文章主要介绍了sql server去除数据中的一些无用的空格,本文给大家提到了一些常用的函数,结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • SQL中EXISTS的用法示例详解

    SQL中EXISTS的用法示例详解

    这篇文章主要介绍了SQL中EXISTS的用法,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • 隐藏在SQLServer 字段中的超诡异字符解决过程

    隐藏在SQLServer 字段中的超诡异字符解决过程

    这套系统做了大半年,这个导入导出还是问题不断,我负责的这块导入导出就是夹在网络版和单机版系统之间,只要任何一边对数据库做了改动这个导入导出就会失败。哎,烦心的事不止这些,最近又遇到了一个非常奇怪的问题。
    2009-10-10

最新评论