Security4:授予查看定义,执行SP和只读数据的权限
2022-10-15 原文
SQL Server数据库有完善的权限管理机制,对于存储过程,其权限分为查看定义,执行和修改,查看SP定义的权限是:VIEW DEFINITION ,执行存储过程的权限是:EXECUTE,修改SP的权限是:ALTER,但是该权限也能修改表结构,视图的定义等数据库对象。数据的读取权限是SELECT,这个查看定义是不同的权限。对于一个数据表,如果仅授予VIEW DEFINITION权限,而没有授予SELECT权限,那么用户只能查看数据表的结构(Schema),而无法查看表中存储的数据。
在管理权限时,可以给特定的用户授予“只能读取数据和执行SP,而不能修改数据”的权限,也就是,使特定的用户只能查看数据(只读,SELECT),只能查看定义(VIEW DEFINITION),和执行SP的权限(EXECUTE),这样的权限设置,既能使用户查看到业务数据,又能避免用户私自修改数据。
对于数据的读取权限,SQL Server内置固定数据库角色 db_datareader,把用户添加到该角色中,用户就被授予了对数据库中所有数据(表或视图)的读取权限,就是说,用户可以对数据表或视图执行select命令读取数据;也可以逆向思考,不允许用户修改数据,把用户添加到固定数据库角色 db_denydatawriter 中,这样,用户不能添加,更新和删除任何数据,就是说,不能对任何数据表执行insert,updae和delete命令。这两个数据库角色,相当于以下两个命令:
grant select to [domain\user]
deny update,delete,insert to [domain\user]
权限的分配分为:授予(grant)和拒绝(deny),对于已分配的权限,也可以通过回收(revoke)命令收回,权限管理是个技术活。
一,授予查看定义的权限
查看数据库对象的权限是VIEW DEFINITION,通常数据库对象是指:数据表,视图,存储过程,函数等,被授予VIEW DEFINITION权限之后,用户只能查看定义,而无法从数据表或视图中查看数据,无法执行SP和函数等。
1,授予SQL Server实例级别的查看定义的权限
以下代码用于授予权限VIEW ANY DEFINITION,代码必须在master数据库中执行,使指定的用户能够查看当前SQL Server实例中的所有数据库对象的定义:
use master
go
grant view any definition to [domain\user]
2,授予User,只能查看当前数据库对象的定义的权限
以下代码用于授予VIEW DEFINITION,使指定的用户能够查看指定数据库中的所有对象的定义:
use db_name
go
grant view definition to [domain\user]
3,授予User,只能查看当前数据库的指定数据库对象的定义的权限
以下代码用于授予VIEW DEFINITION,通过on子句,使指定的用户能够查看指定对象的定义:
use db_name
go
grant view definition
on object::schema_name.object_name
to [domain\user]
二,授予执行存储过程的权限
以下代码授予用户执行存储过程的权限,通过on子句指定用户只能执行特定的SP:
use db_name
go
grant execute
on object::schema_name.object_name
to [domain\user]
如果grant execute省略on子句,表示所有的SP,这样,用户可以执行数据库中的所有SP:
use db_name
go
grant execute
to [domain\user]
三,授予用户修改存储过程的权限
修改存储过程的权限是ALTER,但是,ALTER同时也能修改表结构,视图定义等数据库对象,如下代码所示:
GRANT ALTER TO [domain\user]
如果仅授予用户修改SP的权限,那么必须逐个设置,或者把SP创建在独立的schema下,通过授予用户修改schema,达到控制用户只修改SP的目的:
GRANT ALTER
ON SCHEMA::proc_schema
TO [domain\user]
四,授予用户查看SP的定义,执行和修改SP的权限
通过GRANT子句,可以一次性把查看SP的定义,执行和修改SP的权限都授予指定的用户:
GRANT ALTER, EXECUTE, VIEW DEFINITION
ON SCHEMA::[proc_schema]
TO [domain\user]
在GRANT子句中省略ON子句,表示授予用户的权限作用于所有的数据库对象,包括数据表,视图,存储过程,函数等。
五,授予Public用户查看定义的权限
当Login没有映射到相应的User时,该Login被映射到默认的Public,设置给用户查看定义的权限,这样,每个登陆到SQL Server实例的用户,都可以查看定义。
use master
go
grant view any definition to public
use dbn_ame
go
grant view definition to public
六,授予用户查看定义,只读数据和执行SP的权限
存储过程 sp_msforeachdb @command 是微软未公开的存储过程,该存储过程遍历当前的SQL Server实例的所有数据库,在每个数据库中执行相同的命令:
use master
go
create login [domain\user]
from windows
go
grant view any definition
to [domain\user]
go
exec sp_msforeachdb
'
use [?]
if not exists
(
select *
from sys.database_principals
where name=''domain\user''
)
create user [domain\user]
for login [domain\user]
alter role db_datareader
add member [domain\user]
grant execute to [domain\user]
'
go
遍历数据库的功能,也可以使用游标来实现,本文不再赘述。
参考文档:
Run same command on all SQL Server databases without cursors
Granting View Definition Permission to a User or Role in SQL Server
Security4:授予查看定义,执行SP和只读数据的权限的更多相关文章
MySQL能否授予查看存储过程定义权限给用户
在其他RDBMS中,可以将查看某个存储过程(PROCEDURE)定义的权限给某个用户,例如在SQL Server中,可以单独将查看ProcedureName定义的权限授予UserA GRANT VIE ...
查看ORACLE执行计划的几种常用方法
SQL的执行计划实际代表了目标SQL在Oracle数据库内部的具体执行步骤,作为调优,只有知道了优化器选择的执行计划是否为当前情形下最优的执行计划,才能够知道下一步往什么方向. 执行计划的定义:执行目 ...
查看Job执行的历史记录
SQL Server将Job的信息存放在msdb中,Schema是dbo,表名以“sysjob”开头. 一,基础表 1, 查看Job和Step,Step_ID 是从1 开始的. select j.jo ...
查看Oracle执行计划
1.PL/SQL解释计划窗口 优点:方面 缺点:看到信息有限 2.explain_plan for 针对某个句子优化较方便 3.sqlplus Sqlplus里输入命令: set autotrace ...
如何查看MySQL执行计划
在介绍怎么查看MySQL执行计划前,我们先来看个后面会提到的名词解释: 覆盖索引: MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件 包含所有满足查询需要的数据的索引 ...
查看SQL执行计划
一用户进入某界面慢得要死,查看SQL执行计划如下(具体SQL语句就不完全公布了,截断的如下): call count cpuelapsed disk ...
MSSQL优化之——查看语句执行情况
MSSQL优化之——查看语句执行情况 在写SQL语句时,必须知道语句的执行情况才能对此作出优化.了解SQL语句的执行情况是每个写程序的人必不可少缺的能力.下面是对查询语句执行情况的方法介绍. 一.设置 ...
查看Oracle执行计划的几种方法
查看Oracle执行计划的几种方法 一.通过PL/SQL Dev工具 1.直接File->New->Explain Plan Window,在窗口中执行sql可以查看计划结果.其中,Cos ...
查看Mysql执行计划
使用navicat查看mysql执行计划: 打开profile分析工具: 查看是否生效:show variable like ‘%profil%’查看进程:show processlist选择 ...
随机推荐
从零自学Java-1.编写第一个Java程序
编写第一个Java程序 完成工作:1.在文本编辑器中输入一个Java程序. 2.使用括号组织程序. 3.保存.编译和运行程序. package com.Jsample//将程序的包名称命名为com. ...
JSP 过滤器
JSP教程 - JSP过滤器 JSP过滤器是可用于拦截来自客户端的请求或处理来自服务器的响应的Java类. 过滤器可用于执行验证,加密,日志记录,审核. 我们可以将过滤器映射到应用程序部署描述符文件w ...
ASP.NET动态引用样式表(css)和脚本(js)文件
// 引入js文件 HtmlGenericControl scriptControl = new HtmlGenericControl("script")scriptContr ...
mySQL 约束 (Constraints)
约束用于限制加入表的数据的类型: 1.创建表时规定约束(通过 CREATE TABLE 语句) 2.表创建之后也可以(通过 ALTER TABLE 语句). 约束类型: NOT NULL(非空) UN ...
直播内容不合规怎么办?智能AI为您解决审核难题
背景 近些年来,视频直播快速发展,大量的直播平台如雨后春笋一般出现,但是这同样给直播内容的监管带来了巨大的挑战,一方面国家对于直播内容监管的要求日益严格,另一方面相对于文字内容的审核,多媒体内容的审核 ...
selenium - pycharm三种案例运行模式
1.unittest 运行单个用例 (1)将鼠标放到对应的用例,右键运行即可 2.unittest运行整个脚本案例 将鼠标放到if __name__ == "__main__": ...
dns服务器测试工具
下载地址:https://www.eatm.app/wp-content/uploads/2018/08/eDnsTest.20180810.zip
ArcGIS API for JS4.7加载FeatureLayer,点击d出信息并高亮显示
我加载的是ArcGIS Server本地发布的FeatureService,ArcGIS API for JS4.7记载FeatureLayer时,在二维需要通过代码启用WebGL渲染,在三维模式下, ...
[2018-12-15] Hello World!
这个blog以后就用来发oi相关的算法与数据结构了 还可能想学习一点web前端的知识和一些与计算机有关的软件和技术 可能有空大概会试试搭建blog以及一些各种软件和c++以外的玩意
理解RHEL上安装oracle的配置参数 :/etc/security/limits.conf, /etc/profile, /etc/pam.d/login
无论安装什么版本的Oracle,在安装之前,都需要配置 /etc/pam.d/login /etc/profile /etc/security/limits.conf这三个文件 那这三个文件究 ...
热门专题
VUE如何设置登陆超时和未登录跳到登录界面COOKIE SERVER2016 集成 SHELL FOR I 2个变量 数据库用户账号密码加密校验 安卓PTRACE HOOK框架 OPENCV 显示图片内存泄漏 VB.NET HTTP接口 静态参数@AUTOWIRED注入不进去 QT5 UTF-8转GBK TCL语言 如何定义三维数组 PHP 二维码转 四维 DELPHI CS构架 客户端卡 UBUNTU如何挂在EXFAT格式 AJAX连接C语言程序 使用JENKINS常见报错汇总 POSTGRESQL判断视图是否存在,存在便删除 MASK RCNN 论文 VS无法查看脚本被哪些预制体引用吗 TCP IP通讯数据传输 WPF DATAGRID教程
Home
Powered By WordPress
我们经常谈及Oracle的权限 比如Connect DBA resource sysdba select any table select_catelog_role这样一些权限 让我们眼花缭乱的 那么如何来区分这些种类繁多的privilege中不至于眼迷离呢 这个文章将会对你在这方面的了解起到帮助
以上我们看到的这些权限 都是可以通过grant语句来进行权限赋予 同时也可以用过revoke来进行权限收回的 *** 作的 但是 他们虽然都在grant里出现 但是有各自有着本质的不同
oracle里的权限有两种权限 系统权限和对象权限 所谓系统权限 就是oracle里已经hardcode写死的权限 这些权限 我们是不能自己去扩展的 比如上面提到的select any table create any table create table等 这里的权限已经在oracle里全部规定好了
我们可以通过查看system_privilege_map这个数据字典表来查看所以的oracle系统内置的权限
SQL>select * from system_privilege_map
PRIVILEGE NAME PROPERTY
ALTER SYSTEM
AUDIT SYSTEM
CREATE SESSION
ALTER SESSION
RESTRICTED SESSION
这里就是所有的内置的系统权限了 其实如果有开发过权限系统的经验的话 对这里的这个概念 可以理解为function permission 也就是你可以进行哪些 *** 作
这里特别提到一个另外的知识点 有网游朋友问过我 create any table和create table有什么区别 create table只能老老实实的给自己的scheam创建表 而不能以create table otherschema tablename这样的方式给其他的schema创建表 额外提到这点 有很多朋友这块还是模糊的
oracle通过数据字典表dba_sys_privs这个表来记录user被赋予的系统权限 比如
我们现在执行
SQL>grant select any table to test 把select any table的权限赋予test 这个用户
Grant succeeded
SQL>select * from dba_sys_privs where grantee = TEST
GRANTEE PRIVILEGE ADMIN_OPTION
TEST SELECT ANY TABLE NO
这里就可以查询到这个记录了 admin_option表示的是是否有把当前这个系统权限grant给其他用户的意思 yes 表示test 除了自己有这个权限 还可以把这个权限赋予其他用户 N就是没有grant的权限了
我们可以用一下语句试试
SQL>grant select any table to test with admin option
Grant succeeded
在来看看刚才的记录
GRANTEE PRIVILEGE ADMIN_OPTION
TEST SELECT ANY TABLE YES
现在test 就可以赋予select any table给别的用户了
下面我们看看object permission 其实这里已经名字就可以区分开了 这里是针对于特定的对象的权限 上面的系统权限是限定了可以 *** 作的功能 而object permission就更细化了 具体到了莫个对象你可以 *** 作的功能的权限
比如 A用户建立了一个TableA表 现在为了让B用户可以看到A这个对象 我们就可以把A table的select权限 进行赋予 这里的A table上的select权限就是一个对象权限
除了select 还有update delete insert alter drop index references这样正对于对象的权限
除了可以给表对象指定对象权限外 view sequence procedure function package triggger MV等这些oracle里的对象都可以进行对象的权限指定
对于对象权限来说 由于对象权限完全是动态的 在对一个对象进行grant的时候 才能看到具体的对象权限 所以对象权限是不像system privilege那样有一个表来描述的 只有一个表来记录用户和这个用户对于的对象权限的关系表 这个表就是dba_tab_privs
这里这个名字比较容易让人误会为只有table的对象权限 其实不然 这里其他类型的对象的对象权限也会记录进来
实验一下 还是刚才的test 用户 我现在把对象dbms_xplan的execute的权限给他 dbms_xplan这个有些朋友可能不熟悉 这是执行计划有关的一个对象 朋友们如果没有安装执行计划的包 可以用dbms_output对象做实验
SQL>grant execute on dbms_xplan to test
SQL>grant execute on dbms_output to test
SQL>select * from dba_tab_privs where grantee = TEST
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY
TEST SYS DBMS_XPLAN SYS EXECUTE NO NO
TEST SYS DBMS_OUTPUT SYS EXECUTE
这里注意和fuanction 不同的 这里有一个GRANTABLE的字段 意味和上面admin option一样的作用
不过这里的sql不同了
SQL>grant execute on dbms_xplan to test with grant option
这里是oracle里的权限了
不过有的人可能会问道 咦 你是不是漏掉了 不是我们还可以
grant connect resource dba to username吗 那她们都是什么权限呀
在这里就要注意了 这里的connct resource dba都不是权限 而是一个role 角色 一个角色是 个或者多个系统权限或者对象权限的集合 是便于我们管理用户赋权而演化而来的 这里的create role和赋予role权限我们就不详谈了 朋友们可以自己查一查相关资料 role是我们可以动态建立的 建立的role可以用grant来赋予权限 或者把一个role赋予另一个role
我们可以通过dba_roles这个表来查询系统里所有的role
SQL>select * from dba_roles
ROLE PASSWORD_REQUIRED
CONNECT NO
RESOURCE NO
DBA NO
SELECT_CATALOG_ROLE NO
EXECUTE_CATALOG_ROLE NO
DELETE_CATALOG_ROLE NO
我们可以把role的赋予一个用户
比如
SQL>grant select_catalog_role to test
我们可以通过dba_role_privs来查询相关用户的role的赋予 比如
SQL>select * from dba_role_privs where grantee = TEST
lishixinzhi/Article/program/Oracle/201311/16827
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)