我们有这样一个需求:在数据库中建立两个用户,用户A 用于创建一些视图,直接访问自己数据库中一个模式下的表,以及通过数据库链路访问其他数据库中的表;另一个用户B 能访问到这个用户A 中的视图,并且只能访问视图,且访问连接数有限制。
这个用户B 是用来给其他系统访问的,因此对权限和资源使用都需要有限制条件。
这种需求在很多行业的应用中都很常见。假如这是一道面试题,您该如何去回答呢?
我采用下面的方法来回答这个问题。
第一步,创建新用户A 和B 。
这里用户名称分别为ryd_interface_src 和ryd_interface ,对这两个用户都授予非常有限的权限。
drop user ryd_interface_src cascade;
create user ryd_interface_src identified by ryd_interface_src;
grant connect,create view to ryd_interface_src;
drop user ryd_interface cascade;
create user ryd_interface identified by ryd_interface;
grant connect,create synonym to ryd_interface;
第二步,登录数据库一个模式中,授权给用户A ,使得用户A 能创建视图
conn qlzqclient/qlzq+client8
grant select on INVEST_CLOCK to ryd_interface_src with grant option;
grant select on INVEST_LOG to ryd_interface_src with grant option;
这里授权方法加了一个with grant option ,请注意。
第三步,登录数据库用户A 中,创建视图
conn ryd_interface_src/ryd_interface_src
create or replace view run_views as
select id as doc_id, title,fbsj as upload_date,'' as branch_code from qlzq.runs_lantern@CLIENT_QLZQWEB
where EXT1='1' and sysdate > START_TIME
and sysdate < SOLID_TIME
union
select a.doc_id,a.title,a.upload_date,a.branch_code from qlzq.cms_doc_single_attr@CLIENT_QLZQWEB a
left join qlzq.cms_doc_category_map@CLIENT_QLZQWEB b on a.doc_id=b.doc_id
where
a.state =1 and a.is_delete =0
and a.upload_date> sysdate-90
and b.cat_id=4;
create or replace view INVEST_CLOCK_VIEWS as
select * from qlzqclient.INVEST_CLOCK;
create or replace view INVEST_LOG_VIEWS as
select * from qlzqclient.INVEST_LOG;
第四步,在数据库用户A 中,将视图查询权限授予给用户B
因为在步骤二中,加了with grant option ,所以这里视图查询权限可以成功授予。
grant select on INVEST_CLOCK_views to ryd_interface;
grant select on INVEST_LOG_views to ryd_interface;
grant select on run_views to ryd_interface;
第五步,在数据库用户B 中,检查视图能否查询得到,再创建同义词。
conn ryd_interface/ryd_interface
select count(*) from ryd_interface_src.run_views;
select count(*) from ryd_interface_src.INVEST_CLOCK_views;
select count(*) from ryd_interface_src.INVEST_LOG_views;
create synonym run_views for ryd_interface_src.run_views;
create synonym INVEST_CLOCK_views for ryd_interface_src.INVEST_CLOCK_views;
create synonym INVEST_log_views for ryd_interface_src.INVEST_log_views;
第三方的系统直接通过这个同义词就可以访问到用户A 中的视图。这也是对系统安全的一种保护措施。第三方系统登录后,只能看到其同义词,其他的都不会访问得到。
第六步,限制资源使用
因为用户B 是给第三方系统使用,我们无法控制第三方应用的质量,为了防止在应用出现异常连接时数据库会话数暴涨导致数据库整体服务出现故障,所以我们对该用户的数据库会
话数做一个限制。
这里采用profile 的sessions_per_user 功能,实现单个用户会话数的限制。
conn / as sysdba
alter system set resource_limite=true scope=both sid='*';
新建profile, 初始限制为1 ,用于测试。
create profile third_user limit SESSIONS_PER_USER 1 FAILED_LOGIN_ATTEMPTS unlimited;
alter user ryd_interface profile third_user;
将会话数调整到30
alter profile third_user limit SESSIONS_PER_USER 30;
通过以上操作,我们就可以实现这个需求了。
本文链接: http://mikixiyou.iteye.com/blog/1543530 欢迎转载,请注明出处和作者,谢谢合作。
分享到:
相关推荐
通过这种方式,我们能够在MySQL环境中利用视图访问和管理Oracle数据库中的数据,实现数据的无缝集成。这种方法在多数据库环境下的数据整合、报表生成、数据分析等场景中非常有用。在实际应用中,还可能需要考虑错误...
以下是一个具体的示例,展示了如何在 Oracle 中实现一个简单的带参数视图: ```sql CREATE OR REPLACE PACKAGE pkg_pv IS PROCEDURE set_pv(pv VARCHAR2); FUNCTION get_pv RETURN VARCHAR2; END; / CREATE OR ...
Oracle 视图详解是指在 Oracle 数据库中创建的虚拟表,以便用户可以更方便地访问和操作数据库中的数据。视图的定义是一个基于查询的结果集,可以来自一个或多个实际表或视图,或者甚至来自其他数据源。Oracle 视图的...
本篇将详细讲解如何利用C#编程语言实现Oracle数据库视图的迁移。 首先,我们需要理解C#的基本语法和Oracle数据库的连接方式。C#提供了ADO.NET框架,通过System.Data.OracleClient或Oracle.ManagedDataAccess.Client...
Oracle的视图是数据库管理系统中的一个重要概念,它允许用户从一个或多个表中创建虚拟表,这些虚拟表并不存储实际数据,而是根据查询时的定义动态生成结果集。视图在数据库设计中扮演着多种角色,包括数据抽象、权限...
例如,用户 A 有一个表 a,用户 B 需要访问该表,可以在用户 B 下创建一个同义词 a,指向用户 A 的表 a。这样,用户 B 就可以使用同义词 a 来访问用户 A 的表 a。 在实现同义词的过程中,需要 grant 权限给用户 B,...
本实验涵盖了 Oracle 中的视图概念、创建视图、显示视图的内容、从数据字典视图中选择视图的名字和文本、使用视图查询数据、创建带有条件的视图、显示视图的结构和内容、更新视图、创建复杂视图等内容,为读者提供了...
在Oracle数据库管理中,系统视图是获取数据库信息的关键途径,它们提供了丰富的元数据,用于监控、优化和理解数据库的内部工作。这篇博客主要聚焦于Oracle的常用系统视图以及数据导入导出的相关操作,这对于数据库...
Oracle 创建视图是数据库管理中的一个重要概念,它允许用户创建基于已有表的逻辑视图,以便于数据查询和管理。视图并不实际存储数据,而是作为数据查询的窗口,其内容来自于一个或多个基础表。这使得视图成为数据...
### 常用的Oracle表和视图知识点详解 #### 一、查询某个表在哪些存储过程中被使用 为了高效地了解某个特定表在哪些存储过程中被引用,可以通过以下SQL查询来实现: ```sql SELECT A.NAME AS 过程名称, MIN(A.LINE...
2. 提高数据安全性:视图可以限制用户对原始数据的访问权限,避免了数据泄露和篡改。 3. 提高数据查询效率:视图可以将频繁查询的数据缓存在内存中,提高查询效率。 三、创建只读视图 在某些情况下,我们可能不想...
当用户在SQL语句中引用视图时,Oracle会将引用视图的语句与其定义语句整合成一条新的语句。这条整合后的语句将在共享SQL区域中被解析和执行。如果共享SQL区域中已经有了相同的整合语句,则会直接使用已有的,这有助...
* 可以提高数据访问的安全性,通过视图往往只可以访问数据库中表的特定部分,限制了用户访问表的全部行和列。 * 简化了对数据的查询,隐藏了查询的复杂性。视图的数据来自一个复杂的查询,用户对视图的检索却很简单...
- **ALL**:表示扩展的用户视图,包含了用户可以直接访问的所有对象的信息。 - **DBA**:表示DBA视图,包含了数据库中所有用户可访问的对象信息。 #### 四、视图详解 下面是一些典型的数据字典视图及其含义: 1. *...
2. 安全性:通过视图用户只能查询和修改他们所能见到的数据。数据库中的其它数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上...
Oracle 数据库中的视图通常是不带参数的,但有时,我们需要使用带参数的视图来方便查询数据。下面将简要介绍 Oracle 带参数视图的实践。 一、问题描述 在实际应用中,我们遇到了一个问题,即需要打印一张报表,...
动态性能视图不能被普通用户直接修改,只能查询。这是由系统维护的,并且通常不需要用户干预。要使用这些视图,数据库管理员或拥有SYSDBA角色的用户必须在安装数据库后立即访问它们。为了使数据库管理员可以访问这些...
以下是对给定文件中提到的命令和视图的详细解析,旨在深入理解Oracle中用户、权限和角色的管理。 ### 1. 查看所有用户 在Oracle中,有三种主要的视图用于查看数据库中的用户: - `DBA_USERS`:此视图包含了数据库...
- 在Oracle数据库中,可以通过使用`FORCE`选项来创建视图,即使基础表尚未创建也能实现。例如:`CREATE FORCE VIEW view_name AS SELECT * FROM table_name;` - 使用`FORCE`选项创建的视图初始状态为“无效”,当...
### Oracle视图创建详解 #### 一、前提条件与背景介绍 在Oracle数据库环境中,我们已经建立了两张表:`rt_issuesect` 和 `roadstate`。为了更好地管理和查询这两张表的数据,本教程将详细介绍如何利用Oracle的视图...