
SqlServer用户名和登录名的关系总结.docx
3页SqlServer 用户名和登录名的关系总结登录名:服务器方的一个实体,使用一个登录名只能进入服务器,但是不能让用户访问服务器中的数据库资源每个登录名的定义存放在 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* fromtesttable或select实验:* frompubs..testtable创建登录名 login_ibrahim用此登录名登录“查询分析器”,发现只能查看系统自带的数据库,如 master、Northwind、pubs 等将登录名 login_ibrahim 的服务器角色设置为 Database Creator(若不设置此项,则无法创建数据库)在“查询分析器”中输入 create database test,然后执行,这会创建一个名为test 的数据库查看 test 数据库拥有的用户名,发现系统会自动创建了dbo 和 guest 这两个用户名。
其中 dbo 用户名对应的登录名为 login_ibrahim,不能更改 test 数据库登录名 login_ibrahim 所对应的用户名 dbo,此时 test 数据库的 dbo 用户名,其对应的 登录名有两个 ,一个是login_ibrahim,另一个是 sa(没想到吧^_^,因为 sysadmin 固定服务器角色的成员会自动映射到 dbo)创建登录名 login_ibrahim2,不设置任何服务器角色,将可访问数据库设置为 test打开 test 数据库的用户名列表,会发现系统会为登录名 login_ibrahim2 自动创建一个同名的用户名 login_ibrahim2,然后再创建一个名为 T_ibrahim 的数据表此时用 login_ibrahim2 登录 SQLSERVER,发现不能在 test 数据库中创建表用 login_ibrahim 登录 SQLSERVER,为 login_ibrahim2 用户名授予对 test 数据的db_ddladmin 权限此时用 login_ibrahim2 登录 SQLSERVER,发现可以创建数据表(创建名为 T_ibrahim的数据表),并插入数据!订阅同步。
这个就是配置先说第一种:启动 A 的异步查询支持exec sp_configure 'show advanced options',1 reconfigureexec sp_configure 'Ad Hoc Distributed Queries',1 reconfigure写上删除语句,delete from A.dbo.C where 你的条件插入:use [A]INSERT INTO dbo.C(C 的所有字段,用逗号分隔) select B.dbo.C 的字段from OPENDATASOURCE 对应('SQLOLEDB','Data Source=B 的 IP;User ID=用户名;Password=密码').B.dbo.C别的方法就是建立共同账号,共同在一个服务下管理,那么就不用异步查询了! 直接数据库名.dbo.C查询完毕: 关闭exec sp_configure 'Ad Hoc Distributed Queries',0 reconfigureexec sp_configure 'show advanced options',0reconfigure。












