我是靠谱客的博主 无情含羞草,最近开发中收集的这篇文章主要介绍关于SQL SERVER 的授权问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

关于SQL SERVER 的授权问题
转载自
a.正常的授权流程应该为

1、添加用户角色
要想成功访问 SQL Server 数据库中的数据, 我们需要两个方面的授权:

1.获得准许连接 SQL Server 服务器的权利;就像我们获取了进入某栋大楼的权利

2.获得访问特定数据库中数据的权利(select, update, delete, create table …);就像我们拿到了大楼内某个房间的钥匙

假设,我们准备建立一个 dba 数据库帐户,用来管理数据库 mine。

  1. 首先在 SQL Server 服务器级别,创建登陆帐户(create login)

–创建登陆帐户(create login)create login dba with password=‘1234’, default_database=mine

登陆帐户名为:“dba”,登陆密码:"1234”,默认连接到的数据库:“mine”。 这时候,dba 帐户就可以连接到 SQL Server 服务器上了。但是此时还不能 访问数据库中的对象(严格的说,此时 dba 帐户默认是 guest 数据库用户身份, 可以访问 guest 能够访问的数据库对象)。

要使 dba 帐户能够在 mine数据库中访问自己需要的对象, 需要在数据库 mine中建立一个“数据库用户”,赋予这个“数据库用户” 某些访问权限,并且把登陆帐户“dba” 和这个“数据库用户” 映射起来。 习惯上,“数据库用户” 的名字和 “登陆帐户”的名字相同,即:“dba”。 创建“数据库用户”和建立映射关系只需要一步即可完成:

  1. 创建数据库用户(create user):

[sql] view plain copy
–为登陆账户创建数据库用户(create user),在mydb数据库中的security中的user下可以找到新创建的dba
create user dba for login dba with default_schema=dbo
并指定数据库用户“dba” 的默认 schema 是“dbo”。这意味着 用户“dba” 在执行“select * from t”,实际上执行的是 “select * from dbo.t”。

  1. 通过加入数据库角色,赋予数据库用户“dba”权限

[sql] view plain copy
–通过加入数据库角色,赋予数据库用户“db_owner”权限
exec sp_addrolemember ‘db_owner’, ‘dba’
此时,dba 就可以全权管理数据库 mine中的对象了。

如果想让 SQL Server 登陆帐户“dba”访问多个数据库,比如 mine2。 可以让 sa 执行下面的语句:

[sql] view plain copy
–让 SQL Server 登陆帐户“dba”访问多个数据库
use mine2
go
create user dba for login dba with default_schema=dbo
go
exec sp_addrolemember ‘db_owner’, ‘dba’
go
此时,dba 就可以有两个数据库 mine, mine2的管理权限了!
revoke 与 deny的区别
revoke:收回之前被授予的权限

deny:拒绝给当前数据库内的安全帐户授予权限并防止安全帐户通过其组或角色成员资格继承权限。比如UserA所在的角色组有inset权限,但是我们Deny UserA使其没有insert权限,那么以后即使UserA再怎么到其他含有Insert的角色组中去,还是没有insert权限,除非该用户被显示授权。

简单来说,deny就是将来都不许给,revoke就是收回已经给予的。

[sql] view plain copy
GRANT INSERT ON TableA TO RoleA
GO
EXEC sp_addrolemember RoleA, ‘UserA’ – 用户UserA将有TableA的INSERT权限
GO

REVOKE INSERT ON TableA FROM RoleA – 用户UserA将没有TableA的INSERT权限,收回权限
GO

GRANT INSERT ON TableA TORoleA --重新给RoleA以TableA的INSERT权限
GO

DENY INSERT ON TableA TO UserA – 虽然用户UserA所在RoleA有TableA的INSERT权限,但UserA本身被DENY了,所以用户UserA将没有TableA的INSERT权限。

B.理想很美好,但是显示总是会有各种奇葩的问题会出现,比如我按照上述的方法设置,但是还是会有其他问题

由于之前公司给与其他用户创建了一个guest登录名且用户也为guest,这个东西就坑爹了,为什么这么说?

1.之前不了解是guest用户问题,我随便创建test03登录名,且此登录名并未与第一个库有任何映射,但是test03可以访问之前给guest授权的表,这就是开始疑惑的地方,为什么其他账号都不能看到,只有这个账号才会有这种情况,死守这权限转不开

2.本地测试的时候也没有考虑到用户名的问题,但是到了客户那边就有问题如上,后来才查到了是因为guest是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

实验:

l 创建登录名login_ibrahim

l 用此登录名登录“查询分析器”,发现只能查看系统自带的数据库,如master、Northwind、pubs等

l 将登录名login_ibrahim的服务器角色设置为Database Creator(若不设置此项,则无法创建数据库)

l 在“查询分析器”中输入create database test,然后执行,这会创建一个名为test的数据库

l 查看test数据库拥有的用户名,发现系统会自动创建了dbo和guest这两个用户名。其中dbo用户名对应的登录名为login_ibrahim,不能更改test数据库登录名login_ibrahim所对应的用户名dbo,此时test数据库的dbo用户名,其对应的登录名有两个,一个是login_ibrahim,另一个是sa(没想到吧_,因为sysadmin 固定服务器角色的成员会自动映射到 dbo。)

l 创建登录名login_ibrahim2,不设置任何服务器角色,将可访问数据库设置为test

l 打开test数据库的用户名列表,会发现系统会为登录名login_ibrahim2自动创建一个同名的用户名login_ibrahim2,然后再创建一个名为T_ibrahim的数据表

l 此时用login_ibrahim2登录SQLSERVER,发现不能在test数据库中创建表

l 用login_ibrahim登录SQLSERVER,为login_ibrahim2用户名授予对test数据的db_ddladmin权限

l 此时用login_ibrahim2登录SQLSERVER,发现可以创建数据表(创建名为T_ibrahim的数据表),并插入数据。
C.最后去除guest用户,test03就不能在查看之前guest所访问的表了
D.这个问题花了4天的时间,因为大部分的精力都放在了权限上面而没有考虑是用户名的问题。总之还是因为对于数据库的不熟悉而造成

在这里插入图片描述
在这里插入图片描述

最后

以上就是无情含羞草为你收集整理的关于SQL SERVER 的授权问题的全部内容,希望文章能够帮你解决关于SQL SERVER 的授权问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部