怎样给某一用户创建视图的最小权限

问题:

今天群里有位同学提问:我怎样可以给某一用户在dbo架构中创建视图的最小权限?

-------------------------------------------------------------------------------------------

第一想法很简单无非是:

CREATE ROLE MyRole;
GO
GRANT CREATE VIEW TO MyRole;
GO
CREATE USER MyUser WITHOUT LOGIN;
GO
EXEC sp_addrolemember ‘MyRole‘, ‘MyUser‘;
GO
EXECUTE AS USER = ‘MyUser‘;
GO
CREATE VIEW dbo.V_TEST
AS
SELECT 1 AA
GO
REVERT
GO

但事实是,如果仅仅这样授权,该用户会收到这样的错误信息:
消息 2760,级别 16,状态 1,过程 V_TEST,第 9 行
The specified schema name "dbo" either does not exist or you do not have permission to use it.

错误的原因是该用户没有修改架构的权限.于是添加修改dbo架构的授权:

GRANT ALTER ON SCHEMA::dbo TO MyRole;
GO
CREATE VIEW dbo.V_TEST
AS
SELECT 1 AA
GO
REVERT
GO

这次创建视图执行成功了.
但新的问题来了.由于用户拥有了修改dbo架构的权限,用户也就有了修改表/视图/存储过程/函数等的权限

,甚至拥有了删除这些对象的权限,通过刚才的授权,下面的语句就能执行成功:

EXECUTE AS USER = ‘MyUser‘;
GO
ALTER TABLE dbo.MyTable
ADD AnotherID INT NULL;
GO
REVERT;
GO   

EXECUTE AS USER = ‘MyUser‘;
GO
DROP TABLE dbo.MyTable;
GO
REVERT;
GO 

要命的是,我们不能简单通过授权来禁止用户在某一架构下所有对象的删除和修改权限。

-------------------------------------------------------------------------------------------

最终解决方案:使用数据库级别的DDL触发器来取消某一角色用户的删除/修改相关对象的事物。

CREATE TRIGGER [trig_db_BlockDropObjcect]
ON DATABASE
FOR  DROP_TABLE,DROP_VIEW,DROP_PROCEDURE,DROP_FUNCTION,DROP_CONTRACT,DROP_DEFAULT,DROP_SYNONYM,DROP_TYPE
    ,ALTER_TABLE,ALTER_PROCEDURE,ALTER_FUNCTION
AS
BEGIN
   IF IS_MEMBER(‘MyRole‘) = 1
   BEGIN
       PRINT ‘You are not authorized to alter or drop this object.‘;     --仅保留修改视图权限
       ROLLBACK TRANSACTION;
   END;
END; 
时间: 2024-10-31 20:36:15

怎样给某一用户创建视图的最小权限的相关文章

Oracle创建视图显示无权限

问题:使用scott登录Oracle以后,创建视图,提示"权限不够",怎么解决? 回答: 这是因为scott这个帐户目前没有创建视图的权限.解决方法为: 首先使用system帐户进行登录,其中"tigertiger"为安装Oracle时所指定的密码(可修改): sqlplus system/tigertiger 然后执行: grant create any view to scott 提示:授权成功. 执行: exit 退出当前system帐户. 再使用sqlplu

linux 用户创建、管理、权限分配

(1)su与sudo su:通过su可以在用户之间切换,如果超级权限用户root向普通或虚拟用户切换不需要密码,什么是权力?这就是!而普通用户切换到其它任何用户都需要密码验证: sudo: sudo扮演的角色注定了它要在安全方面格外谨慎,否则就会导致非法用户攫取root权限.同时,它还要兼顾易用性,让系统管理员能够更有效,更方便地使用它. # 1. sudo能够限制指定用户在指定主机上运行某些命令.# 2. sudo可以提供日志,忠实地记录每个用户使用sudo做了些什么,并且能将日志传到中心主机

linux用户创建删除以及文件权限查看修改

一. 1.查看用户 命令如下:whoami 2.创建用户 创建用户命令:sudo adduser hello 超级用户是 root 删除用户名命令:sudo deluser hello --remove-home 切换用户登录命令: su -l hello 3.用户组 groups 查看用户组命令:cat  /etc/group 或者:cat  /etc/group | sort    (这样显示出来的数据是按照字典顺序排列的) 创建用户组:usermod 二.linux文件的权限 1.权限查看

Oracle 12c 用户创建、角色、权限

一.创建用户 创建用户默认的是container=all,在cdb中只能创建全局用户(c##开头),会在cdb和所有的pdb中创建该用户(但是pdb中的全局用户需要另外授权才能够在pdb中访问).在pdb中只能创建的用户为本地用户 SQL> show con_name; CON_NAME ------------------------------ CDB$ROOT SQL> create user user1 identified by user1; create user user1 id

Oracle创建用户 创建表空间 分配权限

cmdsqlplus /as sysdba ;1:创建临时表空间create temporary tablespace sjztjpt_temp tempfile 'D:\app\chenxp\oradata\orcl\sjztjpt_temp.dbf' size 50m autoextend on next 50m maxsize 20480m extent management local; 2:创建数据表空间create tablespace sjztjpt_data logging da

SQLServer和Oracle创建视图用户

在数据集成的开发中,经常会需要给对方创建视图,让其可以查看一些必要的数据.既在数据库中创建用户,并赋给该用户查询视图的权限 一.SQLServer --创建登录用户账户USE [master] GO CREATE LOGIN [kyst] WITH PASSWORD=N'xxx', DEFAULT_DATABASE=[RDSYSCASV121003], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON --创建数据库用户 USE [RDSYSCASV121003] GO

ORACLE 创建视图索引序列

/* 视图View 视图是从若干基本表和(或)其他视图构造出来的表 视图存放的都是查询语句,并没有真实的数据 虚表 作用 限制对数据的操作 复杂查询变简单 提供相同数据的不同显示 UNION ALL 直接添加到一起 UNION 添加到一起并去重 */ --赋予scott用户创建视图的权限 sqlplus / as sysdba; GRANT CREATE VIEW TO SCOTT; --创建视图 CREATE OR REPLACE VIEW V_EMP AS SELECT * FROM EMP

Jenkins 不同角色不同视图及不同权限设置

由于jenkins默认的权限管理体系不支持用户组或角色的配置,因此需要安装第三发插件来支持角色的配置,本文将使用Role Strategy Plugin,介绍页面:https://wiki.jenkins-ci.org/display/JENKINS/Role+Strategy+Plugin 一.配置插件 安装插件后,进入系统设置页面,配置如下: 官网上安全域设置为Servlet容器代理,实际操作发现Jenkins专有用户数据库也是可以的. 二.配置权限 在系统管理页面点击Manage and

[Linux 004]——用户和用户组以及 Linux 权限管理(二)

到权限了.前面讲到了 Linux 中的用户和用户主管理,其实它们的本质(或者用户和用户组出现的初衷)都是方便权限管理.权限管理对于计算机的重要性不言而喻,权限让每个用户能够安安心心的使用计算机,而不用担心别的用户破坏到自己的资源.如果老王手里有一把你家的钥匙,你是不是很蛋疼呢,如果邻居除了老王,还有老赵,老李,老张...都有你家的钥匙,你是不是更加蛋疼呢.作为多用户的 Linux 而言,权限管理至关重要. 1.Linux 文件权限的规定 前文提到,Linux 规定一个文件必须要有三种权限:文件所