关于sqlserver 权限管理和用户授权问题的疑问



--对权限这块一直是糊里糊涂的,没整怎么明白,以前也看过一些资料,始终没弄懂
--所有步骤都是在SSMS下操作的,我先说说我的步骤,再说说我的疑惑


--(利用SA用户)创建登录名appuser1

--数据库DBTEST中有一张表dbo.t1
--在数据库DBTEST中--创建架构app1
--在数据库DBTEST中--创建用户名appuser1,默认架构为app1
--此时用户appuser1可以登录DBtest,但是没有任何建表以及增删查改的权限
--到这里也没问题,毕竟没有任何权限


--修改AppUser1授权为数据库角色成员的db_ddladmin

--可以create table了,因为有默认架构,创建的表为app1.t1
--同时也可以操作dbo.t1,包括增删查改,也可以drop dbo.t1

--我要怎么授权appuser1?
--让appuser1操作自己的架构app1下的数据库对象,
--“行使”其权限(创建app1下的数据库对象,对app1下的表增删查改等,但是不能操作甚至访问dbo.t1)
--目的就是,使这个用户在其指定的schema下,有足够的(创建数据库对象的)权限
--而不干涉不属于他的schema下的数据库对象


--这里的问题就是授权db_ddladmin后,权限似乎过大了。



--如果我要授权,这个步骤是否可行?或者有其他的授权方式?
--新建一个空库,在当前库中建个schema schema1,
--新建一个用户,授权db_ddladmin,默认架构为schema1
--让这个用户在这个库中随便折腾,是否可行?


--假如一个服务器上有数十个数据库,数百个呢?
--因为确实存在几百个“数据库”
--(我这里目前是oracle,oracle是表空间,就是在同一个实例下,几百个表空间)
--主要是我在想,换做sqlserver的话,改怎么管理这些库
--这个权限改如何管理?




db_ddladmin授权

28 个解决方案

#1


GRANT permission  [ ,...n ] ON SCHEMA :: schema_name
    TO database_principal [ ,...n ]
    [ WITH GRANT OPTION ]
    [ AS granting_principal ]
你是想把权限授予给某个架构吗?

#2


引用 1 楼 DBA_Huangzj 的回复:
GRANT permission  [ ,...n ] ON SCHEMA :: schema_name
    TO database_principal [ ,...n ]
    [ WITH GRANT OPTION ]
    [ AS granting_principal ]
你是想把权限授予给某个架构吗?


我是想一个用户,指定一个架构(默认),授权它可以创建数据库对象,
并且可操作(创建了,删除了,增删查改了)它的架构下面的数据库对象(这一点有点废话了),
并且无权操作其他不属于这个架构的数据库对象


#3


那限定在架构中就可以了,比如GRANT INSERT ON SCHEMA :: HumanResources TO guest;

#4


有木有什么问题?刚才有大任务要做,没有时间说得太细

#5


引用 4 楼 DBA_Huangzj 的回复:
有木有什么问题?刚才有大任务要做,没有时间说得太细


我是想“一次性”授权某个用户创建数据库对象(表,视图,函数,存储过程),当然也包括访问了
不知道怎么处理
GRANT permission  [ ,...n ] ON SCHEMA :: schema_name
    TO database_principal [ ,...n ]

用这个好像不行
grant control on schema::App1 to AppUser1

#6


或者说直白点,

你现在是DBA
开发人员A说了,我有一新系统开发,你给我建个数据库账号(新建一个数据库或者是在已有数据库中给他一个schema)

开发人员A可能要用到表,视图,存储过程,函数
你给他的权限,要满足他的要求,而且不能过大,让他访问别人的表,或者给别人的表(视图,sp)给删了

#7


测了一下,这样可以实现你的要求,但是貌似没有直接全部授权
USE [PermissionTest]
GO
ALTER AUTHORIZATION ON SCHEMA::[App] TO dbo
GO
use [PermissionTest]
GO
GRANT ALTER   ON SCHEMA::[App] TO [Appuser]
GO
GRANT CREATE TABLE  TO [Appuser]
GO

#8


不过其实不一次性授权也合理,毕竟有些粒度不能太大

#9


这个跟:主体、安全实体、角色、权限这些都有关系

#10


重装系统中……

#11


wtf......

#12


引用 9 楼 DBA_Huangzj 的回复:
这个跟:主体、安全实体、角色、权限这些都有关系

我给你私信了,有几个错别字,你凑合看着

#13


这个在sql server里和oracle,确实不太一样。

在oracle中有不同的用户,不同的用户下面可以创建对象,授予权限,你可以给这个用户授予 系统权限和对象的权限。

一个oracle实例对应一个数据库,一个数据库中,可以有多个用户,每个用户下面会有多个对象。

而在sql server中,就麻烦一点,首先,在服务器级别,会有login这个概念,也就是登录名,你可以给login授予登录的权限。

然后在数据库级别会有用户这个概念,每个用户有一个默认的schema架构,在schema下面可以创建很多对象,然后再给用户授予权限,比如,像你上面说的,可以操作某个架构下面的对象,不管是表、存储过程、函数、试图、触发器等等。

#14


另外,为了方便授权,可以创建角色,比如,在oracle中的connect角色有创建会话的权限,而resource有create table、create sequence,create procedure 等等的权限,这个都是系统权限。
有了这些系统权限,这个用户就可以开始创建自己的表,然后去用了。

同样的,sql server也是一样的,也有角色,比如数据库方面的角色:
select *
from sys.database_principals
where type_desc = 'DATABASE_ROLE'


#15


另外,试试这个:

grant take ownership on schema::你的架构to 数据库用户

#16


引用 14 楼 yupeigu 的回复:
另外,为了方便授权,可以创建角色,比如,在oracle中的connect角色有创建会话的权限,而resource有create table、create sequence,create procedure 等等的权限,这个都是系统权限。
有了这些系统权限,这个用户就可以开始创建自己的表,然后去用了。

同样的,sql server也是一样的,也有角色,比如数据库方面的角色:
select *
from sys.database_principals
where type_desc = 'DATABASE_ROLE'


我自己在想,新建账号,对应一个新的数据库,
给予db_ddladmin的角色权限,应该就差不多了
只是把库换做oracle中的“表空间”的换成sqlserver的“数据库”
(一般是,oracle中,同一个库中,某个用户管理着自己下面的对象
换做sqlserver的话,我给你新建个数据库,给你个db_ddladmin的角色
你在自己的数据库里建立数据库对象,随便折腾了



#17


引用 16 楼 x_wy46 的回复:
Quote: 引用 14 楼 yupeigu 的回复:

另外,为了方便授权,可以创建角色,比如,在oracle中的connect角色有创建会话的权限,而resource有create table、create sequence,create procedure 等等的权限,这个都是系统权限。
有了这些系统权限,这个用户就可以开始创建自己的表,然后去用了。

同样的,sql server也是一样的,也有角色,比如数据库方面的角色:
select *
from sys.database_principals
where type_desc = 'DATABASE_ROLE'


我自己在想,新建账号,对应一个新的数据库,
给予db_ddladmin的角色权限,应该就差不多了
只是把库换做oracle中的“表空间”的换成sqlserver的“数据库”
(一般是,oracle中,同一个库中,某个用户管理着自己下面的对象
换做sqlserver的话,我给你新建个数据库,给你个db_ddladmin的角色
你在自己的数据库里建立数据库对象,随便折腾了





嗯,你说的很对。

其实不需要给这个用户一堆权限,因为本质上,这个用户下面的对象都是他自己创建的,不管是表、存储过程、还是函数、触发器,都是他自己创建的,所以他就自动有操作这些对象的权限。

这个就和oracle下面的scott用户,下面一堆表,什么dept,emp,其实最开始,scott只有resource、connect权限,后面都是scott自己创建了这些表的,所以他就可以操作这些对象了,而不需要再通过sys,来授予其他的对象权限了

#18


引用 9 楼 DBA_Huangzj 的回复:
这个跟:主体、安全实体、角色、权限这些都有关系


引用 17 楼 yupeigu 的回复:
Quote: 引用 16 楼 x_wy46 的回复:

Quote: 引用 14 楼 yupeigu 的回复:

另外,为了方便授权,可以创建角色,比如,在oracle中的connect角色有创建会话的权限,而resource有create table、create sequence,create procedure 等等的权限,这个都是系统权限。
有了这些系统权限,这个用户就可以开始创建自己的表,然后去用了。

同样的,sql server也是一样的,也有角色,比如数据库方面的角色:
select *
from sys.database_principals
where type_desc = 'DATABASE_ROLE'


我自己在想,新建账号,对应一个新的数据库,
给予db_ddladmin的角色权限,应该就差不多了
只是把库换做oracle中的“表空间”的换成sqlserver的“数据库”
(一般是,oracle中,同一个库中,某个用户管理着自己下面的对象
换做sqlserver的话,我给你新建个数据库,给你个db_ddladmin的角色
你在自己的数据库里建立数据库对象,随便折腾了





嗯,你说的很对。

其实不需要给这个用户一堆权限,因为本质上,这个用户下面的对象都是他自己创建的,不管是表、存储过程、还是函数、触发器,都是他自己创建的,所以他就自动有操作这些对象的权限。

这个就和oracle下面的scott用户,下面一堆表,什么dept,emp,其实最开始,scott只有resource、connect权限,后面都是scott自己创建了这些表的,所以他就可以操作这些对象了,而不需要再通过sys,来授予其他的对象权限了


每次跟两位交流,都能解开不少的疑惑,感谢!!!

我感觉自己基础不行,人又懒,太惭愧了!
晚上看那个“非你莫属”,58同城招的那个用脚写代码的无臂少年的那期
有老板问“byte”的取值范围,
这个我也只是模模糊糊记得正负都是2的7次方,两遍最大数的绝对值差1
不知道是左边还是右边,后来在查,才知道是二进制的原码,反码,补码的作用结果
至于为什么要用“原码,反码,补码”,
突然想起来上学时候老师吐沫飞溅地在讲台上讲为什么要用“原码,反码,补码”这些
当然不管是程序中,还是数据库中,应该原理都是一样,又翻书,看数据库中各个整型的取值范围

一年老一年,反思的东西越来越多,这些都是基础啊,都忘得差不多了。

最近在弄sqlserver的复制,日志传送,镜像这些,说实话,也就是在本机按照步骤跑一遍,体验一下
这些东西以前也没真正应用过,还有alwayson环境还没搭建起来

#19


引用 18 楼 x_wy46 的回复:
Quote: 引用 9 楼 DBA_Huangzj 的回复:

这个跟:主体、安全实体、角色、权限这些都有关系


引用 17 楼 yupeigu 的回复:
Quote: 引用 16 楼 x_wy46 的回复:

Quote: 引用 14 楼 yupeigu 的回复:

另外,为了方便授权,可以创建角色,比如,在oracle中的connect角色有创建会话的权限,而resource有create table、create sequence,create procedure 等等的权限,这个都是系统权限。
有了这些系统权限,这个用户就可以开始创建自己的表,然后去用了。

同样的,sql server也是一样的,也有角色,比如数据库方面的角色:
select *
from sys.database_principals
where type_desc = 'DATABASE_ROLE'


我自己在想,新建账号,对应一个新的数据库,
给予db_ddladmin的角色权限,应该就差不多了
只是把库换做oracle中的“表空间”的换成sqlserver的“数据库”
(一般是,oracle中,同一个库中,某个用户管理着自己下面的对象
换做sqlserver的话,我给你新建个数据库,给你个db_ddladmin的角色
你在自己的数据库里建立数据库对象,随便折腾了





嗯,你说的很对。

其实不需要给这个用户一堆权限,因为本质上,这个用户下面的对象都是他自己创建的,不管是表、存储过程、还是函数、触发器,都是他自己创建的,所以他就自动有操作这些对象的权限。

这个就和oracle下面的scott用户,下面一堆表,什么dept,emp,其实最开始,scott只有resource、connect权限,后面都是scott自己创建了这些表的,所以他就可以操作这些对象了,而不需要再通过sys,来授予其他的对象权限了


每次跟两位交流,都能解开不少的疑惑,感谢!!!

我感觉自己基础不行,人又懒,太惭愧了!
晚上看那个“非你莫属”,58同城招的那个用脚写代码的无臂少年的那期
有老板问“byte”的取值范围,
这个我也只是模模糊糊记得正负都是2的7次方,两遍最大数的绝对值差1
不知道是左边还是右边,后来在查,才知道是二进制的原码,反码,补码的作用结果
至于为什么要用“原码,反码,补码”,
突然想起来上学时候老师吐沫飞溅地在讲台上讲为什么要用“原码,反码,补码”这些
当然不管是程序中,还是数据库中,应该原理都是一样,又翻书,看数据库中各个整型的取值范围

一年老一年,反思的东西越来越多,这些都是基础啊,都忘得差不多了。

最近在弄sqlserver的复制,日志传送,镜像这些,说实话,也就是在本机按照步骤跑一遍,体验一下
这些东西以前也没真正应用过,还有alwayson环境还没搭建起来



说明你还是很努力的啊。

其实,我对于复制、日至传送、镜像,也只是实践过几遍,也没有在正式的环境中用过,还有你说的alwayson,呵呵,我也没搭建过呢。。。

学sql server,如果你有空的话,可以看看这个书,内容全面,实用性强:

SQL Server 2008实战电子书下载
http://download.csdn.net/detail/sanhuofriend/4516492

#20


另外,我觉得很多时候,知识太多了,你不可能什么都学,最关键的是很多东西学了,往往不容易记住。

对这个权限管理,其实在之前也没怎么用过,概念也有点模糊,但是你提的问题,我看了,觉得很有实际的意义,于是我就查了一些资料,在回答问题的同时,我自己也在整理自己的对这个权限方面的想法。

所以,我自己也学到不少,呵呵,是大家相互学习了

#21


引用 20 楼 yupeigu 的回复:
另外,我觉得很多时候,知识太多了,你不可能什么都学,最关键的是很多东西学了,往往不容易记住。

对这个权限管理,其实在之前也没怎么用过,概念也有点模糊,但是你提的问题,我看了,觉得很有实际的意义,于是我就查了一些资料,在回答问题的同时,我自己也在整理自己的对这个权限方面的想法。

所以,我自己也学到不少,呵呵,是大家相互学习了



是啊,深有感触,很多东西是学习+实践才能巩固,有些东西,当时学习学习,会用了,
放一段时间不用,又生疏了

熟能生巧,巧能生精需要一个不断巩固的过程,最怕就是不是专门搞那一行的,一会搞这个,一会搞那个
当时“弄会”了过一段时间又生疏了,
所以我感觉做东西要有一个专业化的程度,
因为不是专业做这个的,这也是我现在最尴尬的情况





#22


引用 21 楼 x_wy46 的回复:
Quote: 引用 20 楼 yupeigu 的回复:

另外,我觉得很多时候,知识太多了,你不可能什么都学,最关键的是很多东西学了,往往不容易记住。

对这个权限管理,其实在之前也没怎么用过,概念也有点模糊,但是你提的问题,我看了,觉得很有实际的意义,于是我就查了一些资料,在回答问题的同时,我自己也在整理自己的对这个权限方面的想法。

所以,我自己也学到不少,呵呵,是大家相互学习了



是啊,深有感触,很多东西是学习+实践才能巩固,有些东西,当时学习学习,会用了,
放一段时间不用,又生疏了

熟能生巧,巧能生精需要一个不断巩固的过程,最怕就是不是专门搞那一行的,一会搞这个,一会搞那个
当时“弄会”了过一段时间又生疏了,
所以我感觉做东西要有一个专业化的程度,
因为不是专业做这个的,这也是我现在最尴尬的情况




哦,也对,你应该是主要写程序的对吧,数据库只是一个部分,那确实没有那么多的精力,来弄这个数据库。

#23


你对一个东西的热爱决定了你的成就,如果你是天天在骂sqlserver如何烂,和oracle相比如何如何差,你不可能在sqlserver上面取得什么成绩,相反,总有一天你会成就你的梦想。

#24


其实,你的学习环境挺好的。

当然,你肯定还需要做很多日常的其他的工作,不可能有那么多的时间都放到数据库上,不过这个环境真的很好,不仅自然环境不错,也是很好的学习环境,很羡慕你啊,要是我有这么好的环境就好了。

好好学,加油。

#25


引用 23 楼 DBA_Huangzj 的回复:
你对一个东西的热爱决定了你的成就,如果你是天天在骂sqlserver如何烂,和oracle相比如何如何差,你不可能在sqlserver上面取得什么成绩,相反,总有一天你会成就你的梦想。



我就是在想,针对一些现实中的应用场景,如果切换到sqlserver下,该如何实现,或者说是规划
本来也没做过,想到的就是很浅层次的问题

#26


引用 25 楼 x_wy46 的回复:
Quote: 引用 23 楼 DBA_Huangzj 的回复:

你对一个东西的热爱决定了你的成就,如果你是天天在骂sqlserver如何烂,和oracle相比如何如何差,你不可能在sqlserver上面取得什么成绩,相反,总有一天你会成就你的梦想。



我就是在想,针对一些现实中的应用场景,如果切换到sqlserver下,该如何实现,或者说是规划
本来也没做过,想到的就是很浅层次的问题
这个想法是对的,不过很多内容的确不是我们想象的那么简单,就像复制,我会搭建,但是在工作中越来越多要求,只有硬着头皮逐个击破。深入的信息我也不懂,只能去找资料,你私信给我你的邮箱,发点资料给你,我暂时没时间研究,所以给你自己看吧

#27


引用 24 楼 yupeigu 的回复:
其实,你的学习环境挺好的。

当然,你肯定还需要做很多日常的其他的工作,不可能有那么多的时间都放到数据库上,不过这个环境真的很好,不仅自然环境不错,也是很好的学习环境,很羡慕你啊,要是我有这么好的环境就好了。

好好学,加油。

自由支配的时间有,但是不多,工作还是占据着绝大部分时间的

今年计划闪人,也就是计划,但是还没有完全决定下来
以前上班每天一来回要3.5个小时,吃小餐馆的地沟油
有时候想想也是,
为啥要为了多出来那二千三千块钱去早起挤地铁,赶公交,呼汽车尾气,吃地沟油,给别人买房(租房不是给别人买房么,呵呵)
一个月多挣三五千块钱不还是那个鸟样,看看那些买了房的,也是累的跟狗一样
人生就像打电话,早晚都要挂的,谁先挂还不一定呢
呵呵,扯远了

很多时候容易冲动,思考了很久,总结了很多,
不是说你拼命做事情,
人家就会看到,或者说人家就会认可,

想到的解决办法
说文明点,凡事看淡一点,不用太认真
说实诚点,吃过亏还不会去学的油条一点,活该

结贴

#28


引用 27 楼 x_wy46 的回复:
Quote: 引用 24 楼 yupeigu 的回复:

其实,你的学习环境挺好的。

当然,你肯定还需要做很多日常的其他的工作,不可能有那么多的时间都放到数据库上,不过这个环境真的很好,不仅自然环境不错,也是很好的学习环境,很羡慕你啊,要是我有这么好的环境就好了。

好好学,加油。

自由支配的时间有,但是不多,工作还是占据着绝大部分时间的

今年计划闪人,也就是计划,但是还没有完全决定下来
以前上班每天一来回要3.5个小时,吃小餐馆的地沟油
有时候想想也是,
为啥要为了多出来那二千三千块钱去早起挤地铁,赶公交,呼汽车尾气,吃地沟油,给别人买房(租房不是给别人买房么,呵呵)
一个月多挣三五千块钱不还是那个鸟样,看看那些买了房的,也是累的跟狗一样
人生就像打电话,早晚都要挂的,谁先挂还不一定呢
呵呵,扯远了

很多时候容易冲动,思考了很久,总结了很多,
不是说你拼命做事情,
人家就会看到,或者说人家就会认可,

想到的解决办法
说文明点,凡事看淡一点,不用太认真
说实诚点,吃过亏还不会去学的油条一点,活该

结贴


呵呵,有道理,特别是“不是说你拼命做事情,人家就会看到,或者说人家就会认可”,深有感触。

其实我觉得学习也是一样的,不是你投入了时间去学习,就一定会有成果,不过,我觉得只要你有兴趣,就好了。
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告