免责声明:我不经常冒险进入数据库管理领域,而且通常坚持数据分析。但是,我正在努力教育自己,并在我创建的一个小样本数据库上构建我的DBA技能组。我不是想在生产中编辑任何东西。
这是这个问题的扩展: How do I show running processes in Oracle DB?
我想为我的用户创建一个视图,其中显示了在我的数据库上运行的所有进程的只读副本(类似于您在linux操作系统的终端中可以执行的操作)。
我不想让我的用户能够改变或杀死不属于他们的进程,我只是想让他们能够轻松查看数据库服务器在任何给定时间的繁忙程度( IE - "只读"访问权限。
我知道运行以下命令并允许用户访问视图,我需要修改数据库权限。我是否可以在用户帐户上启用权限,允许他们从WHAT_IS_RUNNING_ON_DB"中选择*,但不能更改/删除他们不拥有的流程?
CREATE VIEW WHAT_IS_RUNNING_ON_DB AS
SELECT
sess.process, sess.status, sess.username, sess.schemaname,
sql.sql_text
FROM v$session sess,
v$sql sql
WHERE sql.sql_id(+) = sess.sql_id
AND sess.type = 'USER'
AND sess.status = 'ACTIVE'
答案 0 :(得分:0)
如果您只想让他们查看正在运行的内容,只需:
grant select on v$session to USER1;
grant select on v$sql to USER1;
然后在他们的模式中创建视图。或者,如果您不希望他们直接查询这些v $视图(因为您想要隐藏其他列,或者您只想将视图的代码保存在一个地方),您可以创建一个用户,授予对于这个新用户,在该模式中创建视图,然后根据视图授予任何选择。
我不想让我的用户能够改变或杀死进程 不属于他们的
虽然您没有明确要求它,但我将其解释为,您可能希望授予用户杀死他们拥有的进程的能力。
Asktom有一篇很好的文章如何做到这一点:
在该高权限用户的架构中创建以下过程:
create or replace procedure kill_session( p_sid in varchar2, p_serial# in varchar2) is cursor_name pls_integer default dbms_sql.open_cursor; ignore pls_integer; BEGIN select count(*) into ignore from V$session where username = USER and sid = p_sid and serial# = p_serial# ; if ( ignore = 1 ) then dbms_sql.parse(cursor_name, 'alter system kill session ''' ||p_sid||','||p_serial#||'''', dbms_sql.native); ignore := dbms_sql.execute(cursor_name); else raise_application_error( -20001, 'You do not own session ''' || p_sid || ',' || p_serial# || '''' ); end if; END; /
此程序的所有者需要
o SYS授予他们的v_ $ session上的SELECT。这笔补助金必须是 直接对他们,而不是通过角色。
o直接向他们授予ALTER SYSTEM - 而不是通过角色。
然后,您可以将此过程的执行权授予您想要的任何人。它 将允许他们杀死他们拥有的任何会话(在他们的下运行) 用户名)。您可能希望“在v_ $ session上授予select” 当作为SYS连接到这些人时,他们可以“看到” v $ session动态性能视图以获取其sid / serial#对