SQL Server中授予用户查看对象定义的权限

 

在SQL Server中,有时候需要给一些登录名(用户)授予查看所有或部分对象(存储过程、函数、视图、表)的定义权限存。如果是部分存储过程、函数、视图授予查看定义的权限,那么就像下面脚本所示,比较繁琐:

GRANT VIEW DEFINITION ON  YOUR_PROCEDURE TO   USERNAME;

GRANT VIEW DEFINITION ON  YOUR_FUNCTION TO USERNAME;

GRANT VIEW DEFINITION ON  YOUR_VIEW TO USERANEM;

.....................................................

如果是批量授权,那么可以使用下面脚本生成授权脚本。然后执行生成的脚本:

USE DatabaseName;
GO
---给用户授予查看存储过程定义的权限
 
DECLARE @loginname VARCHAR(32);
 
SET @loginname=‘[eopms_reader]‘
 
SELECT  ‘GRANT VIEW DEFINITION ON ‘ + SCHEMA_NAME(schema_id) + ‘.‘
        + QUOTENAME(name) + ‘ TO ‘ + @loginname + ‘;‘
FROM    sys.procedures; 
 
 
--给用户授予查看自定义函数定义的权限
 
SELECT  ‘GRANT VIEW DEFINITION ON ‘ + SCHEMA_NAME(schema_id) + ‘.‘
        + QUOTENAME(name) + ‘ TO ‘ + @loginname + ‘;‘
FROM    sys.objects
WHERE   type_desc IN ( ‘SQL_SCALAR_FUNCTION‘, ‘SQL_TABLE_VALUED_FUNCTION‘,
                       ‘AGGREGATE_FUNCTION‘ );
 
 
--给用户授予查看视图定义的权限
SELECT  ‘GRANT VIEW DEFINITION ON ‘ + SCHEMA_NAME(schema_id) + ‘.‘
        + QUOTENAME(name) + ‘ TO ‘ + @loginname + ‘;‘
FROM    sys.views;
 
 
--给用户授予查看视表定义的权限
SELECT ‘GRANT VIEW DEFINITION ON ‘ + SCHEMA_NAME(schema_id) 
      + QUOTENAME(name) + ‘ TO ‘ + @loginname + ‘;‘ 
FROM sys.tables;

如果你想直接执行脚本,不想生成授权脚本,那么可以使用下面脚本实现授权。当然前提是你选择所要授权的数据库(USE DatabaseName)

DECLARE @loginname VARCHAR(32);
DECLARE @sqlcmd    NVARCHAR(MAX);
DECLARE @name  sysname;
DECLARE @schema_id  INT;
SET @loginname=‘[kerry]‘
 
 
DECLARE procedure_cursor CURSOR  FORWARD_ONLY
FOR
    SELECT  schema_id, name
    FROM   sys.procedures;
 
 
OPEN procedure_cursor;
 
FETCH NEXT FROM procedure_cursor INTO @schema_id, @name;
 
 
 
---给用户授予查看存储过程定义的权限
 
WHILE @@FETCH_STATUS = 0
 
BEGIN
 
 
SET @sqlcmd= ‘GRANT VIEW DEFINITION ON ‘ + SCHEMA_NAME(@schema_id) + ‘.‘
        + QUOTENAME(@name) + ‘ TO ‘ + @loginname + ‘;‘
 
--PRINT @sqlcmd;
EXEC sp_executesql @sqlcmd;
 
FETCH NEXT FROM procedure_cursor INTO @schema_id, @name;
 
END
 
CLOSE procedure_cursor;
 
DEALLOCATE procedure_cursor;
 
 
DECLARE function_cursor  CURSOR FAST_FORWARD 
FOR 
    SELECT schema_id, name
    FROM sys.objects
    WHERE type_desc IN ( ‘SQL_SCALAR_FUNCTION‘, ‘SQL_TABLE_VALUED_FUNCTION‘,
                       ‘AGGREGATE_FUNCTION‘ );
 
 
--给用户授予查看自定义函数定义的权限
 
OPEN function_cursor;
 
FETCH NEXT FROM function_cursor INTO @schema_id,@name;
 
 
WHILE @@FETCH_STATUS = 0 
BEGIN
 
 
SET  @sqlcmd= ‘GRANT VIEW DEFINITION ON ‘ + SCHEMA_NAME(@schema_id) + ‘.‘
        + QUOTENAME(@name) + ‘ TO ‘ + @loginname + ‘;‘
 
--PRINT @sqlcmd;
EXEC sp_executesql @sqlcmd;
 
FETCH NEXT FROM  function_cursor INTO  @schema_id, @name;
 
END
 
CLOSE function_cursor;
DEALLOCATE function_cursor;
 
 
DECLARE view_cursor CURSOR FAST_FORWARD
FOR
    SELECT schema_id, name FROM sys.views;
 
 
OPEN view_cursor;
 
FETCH NEXT FROM view_cursor INTO @schema_id, @name;
 
WHILE @@FETCH_STATUS = 0 
BEGIN
 
 
--给用户授予查看视图定义的权限
SET @sqlcmd= ‘GRANT VIEW DEFINITION ON ‘ + SCHEMA_NAME(@schema_id) + ‘.‘
        + QUOTENAME(@name) + ‘ TO ‘ + @loginname + ‘;‘
 
--PRINT @sqlcmd;
EXEC sys.sp_executesql @sqlcmd;
 
FETCH NEXT FROM view_cursor INTO @schema_id, @name;
 
END
 
CLOSE view_cursor;
DEALLOCATE view_cursor;
 
 
 
DECLARE table_cursor CURSOR FAST_FORWARD
FOR    
 
    SELECT schema_id,name FROM sys.tables;
 
 
OPEN table_cursor;
FETCH NEXT FROM table_cursor INTO @schema_id, @name;
 
WHILE @@FETCH_STATUS = 0
BEGIN
 
    SET @sqlcmd =‘GRANT VIEW DEFINITION ON ‘ + SCHEMA_NAME(@schema_id) + ‘.‘
            + QUOTENAME(@name) + ‘ TO ‘ + @loginname + ‘;‘
    
    --PRINT @sqlcmd;
    EXEC sys.sp_executesql @sqlcmd;
 
    FETCH NEXT FROM table_cursor INTO @schema_id, @name;
 
END
 
CLOSE table_cursor;
DEALLOCATE table_cursor;

如果单个用户授权,那么使用上面方法已经OK,但是一个系统,经常遇到这种授权情况,那么使用上面方法也会变得非常繁琐;另外,当新增表、视图、存储过程后,又需要修改相关授权脚本,这样变得非常麻烦繁琐,那么可以创建一个数据库角色,授予查看数据库对象定义的权限,然后新建登录名时,将这个数据库角色授予新建的登录名即可。这样以后即使有权限啥变化,只需要调整数据库角色的权限即可,不需修改登录名。对于重复性的授权工作会变得非常方便、简单。例如,需要给新建的登录名kerry授予查看数据库对象定义的权限,那么首先创建数据库角色View_Definiton,然后将查看定义的权限授予数据库角色View_Definiton,最后,创建了登录名kerry后,只需将角色View_Definiton授予kerry即可。

USE AdventureWorks2014;
GO
CREATE ROLE [View_Definiton] AUTHORIZATION [dbo]
GO
 
 
 
 
 
 
DECLARE @loginname VARCHAR(32);
 
SET @loginname=‘View_Definiton‘
 
SELECT  ‘GRANT VIEW DEFINITION ON ‘ + SCHEMA_NAME(schema_id) + ‘.‘
        + QUOTENAME(name) + ‘ TO ‘ + @loginname + ‘;‘
FROM    sys.procedures; 
 
 
--给用户授予查看自定义函数定义的权限
 
SELECT  ‘GRANT VIEW DEFINITION ON ‘ + SCHEMA_NAME(schema_id) + ‘.‘
        + QUOTENAME(name) + ‘ TO ‘ + @loginname + ‘;‘
FROM    sys.objects
WHERE   type_desc IN ( ‘SQL_SCALAR_FUNCTION‘, ‘SQL_TABLE_VALUED_FUNCTION‘,
                       ‘AGGREGATE_FUNCTION‘ );
 
 
--给用户授予查看视图定义的权限
SELECT  ‘GRANT VIEW DEFINITION ON ‘ + SCHEMA_NAME(schema_id) + ‘.‘
        + QUOTENAME(name) + ‘ TO ‘ + @loginname + ‘;‘
FROM    sys.views;
 
 
--给用户授予查看视表定义的权限
SELECT ‘GRANT VIEW DEFINITION ON ‘ + SCHEMA_NAME(schema_id) +‘.‘
      + QUOTENAME(name) + ‘ TO ‘ + @loginname + ‘;‘ 
FROM sys.tables;

ALTER ROLE [View_Definiton] ADD MEMBER [kerry]

GO

时间: 2024-12-20 01:12:43

SQL Server中授予用户查看对象定义的权限的相关文章

SQL Server中查询用户的对象权限和角色的方法

--SQL Server中查询用户的对象权限和角色的方法 -- 查询用户的object权限 exec sp_helprotect NULL, 'sa' -- 查询用户拥有的role exec sp_helpuser 'public' -- 查询哪些用户拥有指定的系统role exec sp_helpsrvrolemember 'sysadmin' -- 可查询嵌套role WITH tree_roles as ( SELECT role_principal_id, member_principa

如何只授予用户查看存储过程定义的权限

有个网友问我,如何授予某个用户只能查看某些存储过程的定义权限,而不能让用户去修改.执行存储过程.看似简单的问题,却因为从没有碰到这样的需求.花了点时间才梳理.总结清楚. 关于ORACLE账号的权限问题,一般分为两种权限: 系统权限: 允许用户执行特定的数据库动作,如创建表.创建索引.创建存储过程等 对象权限: 允许用户操纵一些特定的对象,如读取视图,可更新某些列.执行存储过程等 像这种查看存储过程定义的权限为对象权限,但是我们还是首先来看看关于存储过程的系统权限吧: SQL> SELECT *

在SQL Server中创建用户角色及授权

参考文献 http://database.51cto.com/art/201009/224075.htm 正文 要想成功访问 SQL Server 数据库中的数据, 我们需要两个方面的授权: 获得准许连接 SQL Server 服务器的权利: 获得访问特定数据库中数据的权利(select, update, delete, create table ...). 假设,我们准备建立一个 dba 数据库帐户,用来管理数据库 mydb. 1. 首先在 SQL Server 服务器级别,创建登陆帐户(cr

SQL Server中,如何查看每个数据库的Owner是哪个SQL Server账户,也就是谁创建的

有时候我们作为SQL Server的DBA,会需要查找每个数据库的Owner是哪个SQL Server账户,也就是谁创建的. 我们可以使用系统存储过程"sys.sp_helpdb",查询到每个数据库的Owner是哪个SQL Server账户: EXEC sys.sp_helpdb 结果如下: 通过查询结果中的owner列,我们就可以知道每个数据库的Owner是哪个SQL Server账户,也就是谁创建的. 原文地址:https://www.cnblogs.com/OpenCoder/p

sqlserver授予用户查看执行计划的权限

sqlserver查看语句的执行计划是非常重要的,可以提高开发人员代码的质量.所以有必要授予开发人员对数据库查看执行计划的权限. 查看执行计划的权限属于数据库一级别的权限,具体例子如下 use test:--选择需要授权的数据库 grant showplan to user;--授权给对应的用户

sql server中的用户临时表和全局临时表的区别

临时表分为: 本地临时表,仅限于当前访问者访问,创建方法去如下:create table #TableName(表结构)储存于数据库tempdb内(硬盘),当前用户断开连接(把当前的),自动删除如果使用中不断开连接,且不需要该临时表请执行:drop table #TableName 全局临时表,所有访问用户访问,创建方法去如下:create table ##TableName(表结构)储存于数据库tempdb内,当所有访问用户断开连接,自动删除删除语句:drop table ##TableNam

第三篇 SQL Server安全主体和安全对象

本篇文章是SQL Server安全系列的第三篇,详细内容请参考原文. 一般来说,你通过给主体分配对象的权限来实现SQL Server上的用户与对象的安全.在这一系列,你会学习在SQL Server实例中通过权限授权来执行操作及访问安全对象.在SQL Server中重要的主体是角色,你会学习角色可以让安全管理比使用单独用户更容易.你也会学习SQL Server的安全对象.授权Authentication is only part of accessing all of the goodies in

为什么SQL语句Where 1=1 and在SQL Server中不影响性能

    最近一个朋友和我探讨关于Where 1=1 and这种形式的语句会不会影响性能.最后结论是不影响.     虽然结论正确,但对问题的认识却远远没有解决问题的根本.实际上在T-SQL语句的书写过程中经常犯得错误就是得出一个很窄的结论,然后教条式的奉若圣经,对于T-SQL领域来说,在网上经常可以看到所谓的优化守则,随便在网上搜了一些摘录如下: 不要有超过5个以上的表连接(JOIN) 考虑使用临时表或表变量存放中间结果 少用子查询 视图嵌套不要过深,一般视图嵌套不要超过2个为宜. 对出现在wh

在SQL Server中查看对象依赖关系

原文 在SQL Server中查看对象依赖关系 Viewing object dependencies in SQL Server Deleting or changing objects may affect other database objects like views or procedures that depends on them and in certain instances, can “break” the depending object. An example can