权限的授予分为三部分:权限(Permission),安全对象(Securable)和安全主体(Principal),这三个术语之间的关系是:Grant Permission on Securable to Principal,通俗地解释是:授予Principal操作Securable的Permission。Principal是被授予权限的实体,Securable是table,view等对象,是Principal操作的对象;有时Principal也会作为Securable,被其他Principal操纵。

一,Role 作为 Principal,被授予权限

查看Permission列表,点击:Permissions (Database Engine),这里列出的是单个权限(Individual permission),role 是权限的集合。

1, 创建角色

Role分为数据库角色和服务器角色,AUTHORIZATION owner_name 子句用于指定角色Owner

CREATE ROLE role_name
AUTHORIZATION owner_name CREATE SERVER ROLE role_name
AUTHORIZATION server_principal

角色的所有者,在删除所有者之前,必须修改角色的所有者关系,经常把角色的所有者设置为dbo:

ALTER AUTHORIZATION
ON ROLE::[role_name] TO [dbo]

如果数据库用户拥有一个role,在删除用户时,数据库将抛出错误:

The database principal owns a database role and cannot be dropped.

2,将权限授予角色,角色是权限的集合

Role作为一个Principal,可以使用Grant子句为role授予权限,这里为role授予Object的Permissions

GRANT <permission> [ ,...n ]
ON [ OBJECT :: ][ schema_name ]. object_name [ ( column [ ,...n ] ) ]
TO <database_principal> [ ,...n ]
[ WITH GRANT OPTION ] <database_principal> ::= Database_user | Database_role

3,为角色增加或删除一个用户成员

ALTER [Server] ROLE role_name
{
[ ADD MEMBER database_principal ]
| [ DROP MEMBER database_principal ]
}

4,示例,授予数据库角色访问table的权限

grant ALTER,DELETE,INSERT,SELECT,UPDATE  --Permission List
on dbo.dt_test --Table Name
to dabase_level_role --Role Name
with GRANT OPTION

二,Role 作为Securable,Principal授予操纵Role的权限

Role 可以是数据库的安全主体(Principal),被授予权限;Role可以是数据库的安全对象(Securable),Grant子句可以授予Principal操纵Role的权限。

GRANT permission [ ,...n ]
ON
{ [ USER :: database_user ]
| [ ROLE :: database_role ]
}
TO <database_principal> [ ,...n ]
[ WITH GRANT OPTION ] <database_principal> ::= Database_user | Database_role

1,Granting CONTROL permission on a user to another user

GRANT CONTROL
ON USER::Wanida
TO RolandX;

2,Granting VIEW DEFINITION permission on a role to a user with GRANT OPTION

GRANT VIEW DEFINITION
ON ROLE::SammamishParking
TO JinghaoLiu
WITH GRANT OPTION;

三,数据库对象权限

对数据库对象的权限控制,粒度是表列,数据行是对象的所有数据行。

GRANT <permission> [ ,...n ] ON
[ OBJECT :: ][ schema_name ]. object_name [ ( column [ ,...n ] ) ]
TO <database_principal> [ ,...n ]
[ WITH GRANT OPTION ]
[ AS <database_principal> ] <database_principal> ::= Database_user | Database_role

对象的权限列表:

  • Scalar function permissions: EXECUTE, REFERENCES.
  • Table-valued function permissions: DELETE, INSERT, REFERENCES, SELECT, UPDATE.
  • Stored procedure permissions: EXECUTE.
  • Table permissions: DELETE, INSERT, REFERENCES, SELECT, UPDATE.
  • View permissions: DELETE, INSERT, REFERENCES, SELECT, UPDATE.

1,Granting SELECT permission on a table

GRANT SELECT ON OBJECT::Person.Address TO RosaQdM;

2,Granting EXECUTE permission on a stored procedure

GRANT EXECUTE ON OBJECT::HumanResources.uspUpdateEmployeeHireInfo
TO Recruiting11;

四,使用固定数据库角色授权,授予某个User只读数据的权限

Step1,在SQL Server中为该用户创建一个Login和User,在创建User时,建立Login 和 User 之间的Mapping 关系。

由于权限是授予user的,所以必须使用Use 子句切换到当前db中

--create Login Name
create login [domain\login]
from windows; use current_db_name
go
--create --UserName
Create User DWReadOnly
for login [domain\login]

Step2,使用DB的Fixed Role

db_datareader :Members of the db_datareader fixed database role can read all data from all user tables.

只需要将User 添加到DB的 db_datareader 中,那么这个User 就能 只能 read 所有的User table,而不会修改任何数据。

step3,使用Alter Role 授予user 只读权限

--Grant readonly
ALTER ROLE [db_datareader]
add MEMBER DWReadOnly

如果要授予Server Role(服务器角色)权限,授予权限的Principal 是Login。

create login [domain\username]
from windows; alter server role sysadmin
add member [domain\username];

五,固定角色

固定角色分为服务器级别和数据库级别,角色的权限是预先定义好的,除了public角色之外,不能修改角色的权限。

1,数据库级别的固定角色

在数据库级别最高的权限是db_owner角色,拥有数据库的最高权限:control database

  • db_owner:允许在数据库中执行任何操作,包括删除数据库
  • db_ddladmin:允许执行DDL命令
  • db_datawriter:允许对所有表进行增删改查操作
  • db_datareader:允许对所有表进行查找操作
  • db_denydatawriter:不允许对表执行insert、update和delete命令
  • db_denydatareader:不允许对表执行select命令
  • public:数据库级别的public角色,权限可以被修改,所有的用户都会继承public角色的权限

2,服务器级别的固定角色

在服务器级别,最高的权限是sysadmin,能够在服务器中执行任何操作。

public 角色,权限可以被修改,所有的login都会继承public角色的权限

3,特殊的public角色

public角色分为:数据库级别和服务器级别

  • 对于数据库级别的public角色,任何数据库的用户(User)都属于public角色
  • 对于服务器级别的public角色,任何服务器的登录(Login)都属于public角色

虽然public角色属于固定(服务器级别和固定数据库级别)的角色,但是其特殊之处在于:角色的权限可以被修改。

每个 SQL Server 的登录(Login)均属于 public 服务器角色,所有的数据库用户(User) 都属于public数据库角色。用户不能删除public角色,但是,可以授予或收回public角色的权限。默认情况下,public角色被分配很多权限,大部分权限都跟数据库中的日常操作有关。默认情况下,

  • 数据库级别的public 角色拥有的权限:查看特定系统表
  • 服务器级别的public 角色拥有的权限:查看数据库,链接服务器(VIEW ANY DATABASE, CONNECT)

当一个对象对所有用户或登录可用时,只需把权限分配给 public 角色即可。默认情况下,所有的数据库用户都属于public角色,因此,授予或回收public角色的权限,将会影响所有的用户。

参考文档:

GRANT Object Permissions (Transact-SQL)

GRANT Database Principal Permissions (Transact-SQL)

GRANT Database Permissions (Transact-SQL)

Database-Level Roles

Server-Level Roles

使用 fixed role 授予权限的更多相关文章

  1. Security5:授予权限

    SQL Server授予用户访问对象的权限,通常的模式是:Grants permissions on a securable to a principal(user or login),也就是说,授予 ...

  2. role roleMapping 权限说明

    根据我的理解,希望能帮助到大家 role表 是权限列表. roleMapping 关联权限(例如那个用户在那个权限里面,或者权限里面包含那个权限) roleMapping的数据不能单独添加.必须在ro ...

  3. oracle创建用户、授予权限及删除用户

    创建用户   oracle对表空间 USERS 无权限 alter user 用户名 quota unlimited on users;   //创建临时表空间 create temporary ta ...

  4. Forms身份验证和基于Role的权限验证

    Forms身份验证和基于Role的权限验证 从Membership到SimpleMembership再到ASP.NET Identity,ASP.NET每一次更换身份验证的组件,都让我更失望.Memb ...

  5. 使用MySQL命令行新建用户并授予权限的方法

    MySQL命令行能否实现新建用户呢?答案无疑是肯定的.而且在使用使用MySQL命令行新建用户后,还可以为用户授予权限. 首先要声明一下:一般情况下,修改MySQL密码,授权,是需要有mysql里的ro ...

  6. Oracle_创建用户_授予权限

    Oracle_创建用户_授予权限 --创建用户,需要足够的权限  create create user hzf identified by hzf;    --给用户bjsxt分配权限  grant ...

  7. centos下mysql授予权限提示ERROR 1133 (42000): Can't find any matching row in the user table

    错误: 给mysql对应的用户授予权限的时候提示报错: 解决方法: 后面才知道原来是同事这边新增了用户没有flush grant all privileges on *.* to 'user'@'%' ...

  8. Security6:授予权限的思路和一般步骤

    思路是:Grants permissions on a securable to a principal. The general concept is to GRANT <some permi ...

  9. oracle数据库如何创建角色并对角色授予权限

    目标: 1.创建角色test1_role, 授予create session 权限 2.创建角色test2_role,授予create procedure, create sequence, crea ...

随机推荐

  1. 树链剖分+线段树 HDOJ 4897 Little Devil I(小恶魔)

    题目链接 题意: 给定一棵树,每条边有黑白两种颜色,初始都是白色,现在有三种操作: 1 u v:u到v路径(最短)上的边都取成相反的颜色 2 u v:u到v路径上相邻的边都取成相反的颜色(相邻即仅有一 ...

  2. twitter.common.concurrent deadline and defer

    此defer非golang中的defer https://tour.golang.org/flowcontrol/12 from twitter.common.concurrent import Ti ...

  3. C语言与java 20155317 王新玮第二次

    20155317 王新玮第二次写作感想   你有什么技能比大多数人(超过90%以上)更好? 刚刚看到这个题目,我的首先想到的是会一些中医,懂得中医的理论框架知识,懂得大部分的中医脉象,能够解决日常生活 ...

  4. Github+Jekyll —— 创建个人免费博客(二)Ruby+Jekyll部署

    摘要: 本文中我将介绍一下如何在github上搭建个人Blog(博客),也顺便让我们掌握一下github Pages功能,另外还涉及到Jekyll技术. ======================= ...

  5. jQueryUI Draggable 和 Droppable 配合使用时遇到的两个坑

    jQueryUI 的 拖拽插件极大的方便了开发者对拖拽功能的实现,但是官方教程给的太笼统,在具体实现的时候很多地方不明确,这里说一下我遇到的两个 "小坑": 1:Draggable ...

  6. 1002. A+B for Polynomials (25)

    题目链接:https://www.patest.cn/contests/pat-a-practise/1002 原题如下: This time, you are supposed to find A+ ...

  7. Usaco*Monthly Expense

    Description Farmer John是一个令人惊讶的会计学天才,他已经明白了他可能会花光他的钱,这些钱本来是要维持农场每个月的正常运转的.他已经计算了他以后N(1<=N<=100 ...

  8. 安卓学习之--UI控件用法 单选 按钮 下拉框

    1.单选 .RadioGroup 可将各自不同的RadioButton ,设限于同一个Radio 按钮组,同一个RadioGroup 组里的按钮,只能做出单一选择(单选题). <RadioGro ...

  9. Win7网上邻居提示未授予用户在此计算机上的请求登录类型解决办法

        内容简介 装了Win7之后很多人遇到这样的问题,网上邻居访问Win7的电脑时出现“未授予用户在此计算机上的请求登录类型”问题.打开“控制面板”--“管理工具”--“本地安全策略”--“本地策略 ...

  10. advstringgrid笔记

    一下操作是在advstringgrid7.4.6.3版本下有效,advstringgrid控件名设置为 zy 一.属性设置 1.修改单元格内的值:zy.cells[col,row]='value'; ...