马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
ORA-01927
- [oracle@testos:/home/oracle]$ oerr ora 01927
- 01927, 00000, "cannot REVOKE privileges you did not grant"
- // *Cause: You can only revoke privileges you granted.
- // *Action: Don't revoke these privileges.
- [oracle@testos:/home/oracle]$
复制代码 模拟报错
基本的,众所周知对于ORACLE的体系权限,由sysdba角色的用户赋予用户A该权限,并通过WITH ADMIN OPTION将级联赋权的权限赋予用户A,A又将该权限赋予用户B时,B的该体系权限既可被A用户收回,也可被sysdba角色的用户收回(简述为体系权限可跨用户收回)。
那么,对象权限是否可以进行与上述雷同的跨用户收回?本实验旨在讨论这个题目
**实验名称:**ORACLE对象权限跨用户收回的可行性
**实验目的:**研究ORACLE对象权限是否可以进行跨用户收回
实验准备:
- -- 创建两个用户A和B并赋予密码,并且创建时两个用户均为非锁定状态:
- CREATE USER a IDENTIFIED BY oracle ACCOUNT UNLOCK;
- CREATE USER b IDENTIFIED BY oracle ACCOUNT UNLOCK;
- grant connect,resource to a;
- grant connect,resource to b;
复制代码 实验过程:
- -- 先检查用户a和用户b都没有对hr.employees的SELECT权限
- SQL> SELECT GRANTEE,OWNER,TABLE_NAME,PRIVILEGE FROM user_tab_privs WHERE GRANTEE = 'A';
- no rows selected
- SQL> SELECT GRANTEE,OWNER,TABLE_NAME,PRIVILEGE FROM user_tab_privs WHERE GRANTEE = 'B';
- no rows selected
- -- 登录hr,将对hr.employees的SELECT权限赋给用户a
- SQL> conn hr/hr
- Connected.
- SQL> GRANT SELECT ON employees TO a WITH GRANT OPTION;
- Grant succeeded.
- -- 查询用户a的对象权限
- SQL> SELECT GRANTEE,OWNER,TABLE_NAME,PRIVILEGE FROM user_tab_privs WHERE GRANTEE = 'A';
- GRANTEE OWNER TABLE_NAME PRIVILEGE
- ------------------------- ------------------------- ---------- ---------
- A HR EMPLOYEES SELECT
- -- 用a用户把对hr.employees的SELECT权限赋给用户b
- SQL> CONN a/oracle
- Connected.
- SQL> GRANT SELECT ON hr.employees TO b;
- Grant succeeded.
- SQL> SELECT GRANTEE,OWNER,TABLE_NAME,PRIVILEGE FROM user_tab_privs WHERE GRANTEE = 'B';
- GRANTEE OWNER TABLE_NAME PRIVILEGE
- ------------------------- ------------------------- ---------- ---------
- B HR EMPLOYEES SELECT
- -- 用hr用户收回用户b对 hr.employees的SELECT权限
- SQL> CONN hr/hr
- Connected.
- SQL> REVOKE SELECT ON hr.employees FROM b;
- REVOKE SELECT ON hr.employees FROM b
- *
- ERROR at line 1:
- ORA-01927: cannot REVOKE privileges you did not grant
- -- 用sys用户收回用户b对 hr.employees的SELECT权限
- SQL> conn sys/oracle as sysdba
- Connected.
- SQL> REVOKE SELECT ON hr.employees FROM b;
- REVOKE SELECT ON hr.employees FROM b
- *
- ERROR at line 1:
- ORA-01927: cannot REVOKE privileges you did not grant
- -- 查看用户b对hr.employees的SELECT权限的直接赋权者,是用户A
- SQL> CONN b/oracle
- Connected.
- SQL> SELECT GRANTEE,OWNER,TABLE_NAME,PRIVILEGE,GRANTOR FROM user_tab_privs WHERE GRANTEE='B';
- GRANTEE OWNER TABLE_NAME PRIVILEGE GRANTOR
- ------------------------- ------------------------- ---------- --------- -------
- B HR EMPLOYEES SELECT A
- -- 用A用户收回用户b对 hr.employees的SELECT权限
- SQL> conn a/oracle;
- Connected.
- SQL> REVOKE SELECT ON hr.employees FROM b;
- Revoke succeeded.
- -- 查看用户b对hr.employees的SELECT权限
- SQL> conn b/oracle;
- Connected.
- SQL> SELECT GRANTEE,OWNER,TABLE_NAME,PRIVILEGE,GRANTOR FROM user_tab_privs WHERE GRANTEE='B';
- no rows selected
复制代码 实验结果:
用 hr用户 把对 hr.employees的SELECT权限添加WITH GRANT OPTION 选项 赋给 用户a 而且 由 用户a 把对 hr.employees的SELECT权限赋给用户b以后,无论是hr用户照旧sys用户,都无法直吸收回用户b对hr.employees的SELECT权限。
实验结论:
对象权限不可以跨用户(包括sys用户)收回,仅可以被该权限的直接赋权者收回。
2、 Oracle DBLink毗连数过多的题目(Ora-02020)
- [oracle@testosa:/home/oracle]$ oerr ora 02020
- 02020, 00000, "too many database links in use"
- // *Cause: The current session has exceeded the INIT.ORA open_links maximum.
- // *Action: Increase the open_links limit, or free up some open links by
- // committing or rolling back the transaction and canceling open
- // cursors that reference remote databases.
- [oracle@testosa:/home/oracle]$
复制代码 报错信息
- 报错全信息:
- Error:OR A -04052在查: 找远程对象 NIP.PB_PERADDRESSLIST@DB_NIP 时出错
- ORA-00604 : 递归 SQL 级别 1 出现错误
- ORA-02020 : 过多的数据库链接在使用中
复制代码 查看一下有关link的参数
- SQL> show parameter open_links
-
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- open_links integer 4
- open_links_per_instance integer 4
-
- SQL>
复制代码 参数的解释:
open_links: 每个session最多允许的dblink数目;
open_links_per_instance: 指每个实例最多允许的dblink个数
扩大允许使用dblink 量;
- SQL> alter system set open_links=50 scope=spfile;
-
- System altered
- SQL> alter system set open_links_per_instance=50 scope=spfile;
-
- System altered
-
- SQL> show parameter open_links
-
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- open_links integer 4
- open_links_per_instance integer 4
-
- SQL>
-
- -- 重启后生效...
-
- SQL> shutdown immediate
- 数据库已经关闭。
- 已经卸载数据库。
- ORACLE 例程已经关闭。
- SQL>
- SQL> startup
- ORACLE 例程已经启动。
- Total System Global Area 293601280 bytes
- Fixed Size 1248600 bytes
- Variable Size 96469672 bytes
- Database Buffers 188743680 bytes
- Redo Buffers 7139328 bytes
- 数据库装载完毕。
- 数据库已经打开。
- SQL>
-
- 参数检查:
- SQL> show parameter open_links
-
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- open_links integer 50
- open_links_per_instance integer 50
复制代码 参考资料
Doc ID 387848.1
The following view shows the database link connections that are currently open in your current session:
V$DBLINK - Lists all open database links in your session, that is, all database links with the IN_TRANSACTION column set to YES.
NOTE: It is important to state that the section above “Lists all open database links in your session” is important, as this is only YOUR open dblinks that can be seen.
For example, you can create and execute the script below to determine which links are open (sample output included):
- COL DB_LINK FORMAT A25
- COL OWNER_ID FORMAT 99999 HEADING "OWNID"
- COL LOGGED_ON FORMAT A5 HEADING "LOGON"
- COL HETEROGENEOUS FORMAT A5 HEADING "HETER"
- COL PROTOCOL FORMAT A8
- COL OPEN_CURSORS FORMAT 999 HEADING "OPN_CUR"
- COL IN_TRANSACTION FORMAT A3 HEADING "TXN"
- COL UPDATE_SENT FORMAT A6 HEADING "UPDATE"
- COL COMMIT_POINT_STRENGTH FORMAT 99999 HEADING "C_P_S"
- SELECT * FROM V$DBLINK
- /
- SQL> @dblink
- DB_LINK OWNID LOGON HETER PROTOCOL OPN_CUR TXN UPDATE C_P_S
- ------------------------- ------ ----- ----- -------- ------- --- ------ ------
- INST2.ACME.COM 0 YES YES UNKN 0 YES YES 255
复制代码 Note that above displays ONLY details about database links open in the session within which you are working.
If looking for details about database links open by different sessions, might use below:
- sqlplus /nolog
- connect / as sysdba
- select username, osuser, status, sid, serial#, machine,
- process, terminal, program from v$session
- where saddr in (select k2gtdses from sys.x$k2gte );
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |