如果一个表的外键引用的是另一个用户的表,需要特别的权限吗?答案就是refrences权限。虽然一个schema(用户)下表的外键引用的是其他schema(用户)的表,是一种不太好的设计。但现实中仍然会有这种情况。下面来看看reference的作用:

测试环境: Oracle 10.2.0.1 Redhat Linux AS4 数据库里用于测试的两个用户test1和test2,只有connect角色权限和表空间使用权限。

SQL> connect / as sysdba Connected. SQL> create table test1.t1 as select * from dba_objects where rownum< =1000;

Table created.

SQL> create table test2.t2 as select * from dba_objects where rownum< =1000;

Table created.

SQL> alter table test1.t1 add constraint pk_t1 primary key(object_id);

Table altered.

现在,我们用用户test2连接到数据库,在表test2.t2的object_id字段上增加一个外键,外键引用test1.t1表的object_id字段:

SQL> connect test2/test Connected. SQL> alter table t2 add constraint fk_t2 foreign key (object_id) references test1.t1(object_id); alter table t2 add constraint fk_t2 foreign key (object_id) references test1.t1(object_id) * ERROR at line 1: ORA-00942: table or view does not exist

我们将test1.t1表的查询权限赋给test2:

SQL> grant select on test1.t1 to test2;

Grant succeeded.

再次增加外键:

SQL> alter table t2 add constraint fk_t2 foreign key (object_id) references test1.t1(object_id); alter table t2 add constraint fk_t2 foreign key (object_id) references test1.t1(object_id) * ERROR at line 1: ORA-01031: insufficient privileges

可以看到报权限不足。我们再看看如果将DBA权限给test2会怎么样:

SQL> connect / as sysdba Connected. SQL> grant dba to test2; Grant succeeded.

SQL> connect test2/test Connected. SQL> alter table t2 add constraint fk_t2 foreign key (object_id) references test1.t1(object_id); alter table t2 add constraint fk_t2 foreign key (object_id) references test1.t1(object_id) * ERROR at line 1: ORA-01031: insufficient privileges

还是报权限不足。

SQL> connect / as sysdba Connected. SQL> revoke dba from test2;

Revoke succeeded. SQL> grant references on test1.t1 to test2;

Grant succeeded. SQL> connect test2/test Connected. SQL> alter table t2 add constraint fk_t2 foreign key (object_id) references test1.t1(object_id);

Table altered. SQL> select owner,constraint_name,constraint_type,table_name,r_owner,r_constraint_name,status,validated,invalid from user_constraints;

OWNER CONSTRAINT_NAME C TABLE_NAME R_OWNER R_CONSTRAINT_NAME STATUS VALIDATED INVALID ---------- -------------------- - ---------- ---------- -------------------- ---------- ---------- ---------- TEST2 FK_T2 R T2 TEST1 PK_T1 ENABLED VALIDATED

我们看到将test1.t1表的references权限给test2后,外键增加成功。 如果这个时候取消这个权限,会怎么样?

SQL> revoke references on test1.t1 from test2; revoke references on test1.t1 from test2 * ERROR at line 1: ORA-01981: CASCADE CONSTRAINTS must be specified to perform. this revoke

可以看到由于已经有了引用其他表的外键,不能直接取掉这个权限。

SQL> revoke references on test1.t1 from test2 cascade constraints;

Revoke succeeded.

再看看test2用户的外键:

SQL> select owner,constraint_name,constraint_type,table_name,r_owner,r_constraint_name,status,validated,invalid from user_constraints;

no rows selected

加了cascade constraints之后的取消权限语句,直接导致了test2用户上的外键被删除。

SQL> grant references on test1.t1 to dba;

Grant succeeded.

SQL> grant dba to test2;

Grant succeeded. SQL> connect test2/test Connected. SQL> alter table t2 add constraint fk_t2 foreign key (object_id) references test1.t1(object_id); alter table t2 add constraint fk_t2 foreign key (object_id) references test1.t1(object_id) * ERROR at line 1: ORA-01031: insufficient privileges

如上面所示,references权限只能直接赋予给用户,通过角色赋予用户,没有作用。另外,没有系统级的references权限,如references any table等。

SQL> grant references on test1.t1 to test2;

Grant succeeded.

SQL> grant references on test1.t1 to dba;

Grant succeeded.

SQL> select * from role_tab_privs where privilege like ‘%REFERENCES%’;

no rows selected

SQL> select grantee,owner,table_name,grantor,privilege from dba_tab_privs where privilege like ‘%REFERENCES%’;

GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE ------------ ---------- -------------------- ---------- --------------- SYSTEM SYS INCEXP SYS REFERENCES SYSTEM SYS INCVID SYS REFERENCES SYSTEM SYS INCFIL SYS REFERENCES TEST2 TEST1 T1 TEST1 REFERENCES

我们看到将references赋给role并没有起作用,虽然grant语句没有报错,但在role_tab_privs中并没有记录。 虽然DBA角色没有references权限,但是可以将任意一个表的references权限赋给他人(这是因为DBA角色具有GRANT ANY OBJECT PRIVILEGE权限)。SYS也需要显式的某个表上赋予references权限才能引用那个表。

SQL> create table t3 as select * from dba_objects where object_id< =1000;

Table created. SQL> alter table t3 add constraint fk_t3 foreign key (object_id) references test1.t1(object_id); alter table t3 add constraint fk_t3 foreign key (object_id) references test1.t1(object_id) * ERROR at line 1: ORA-01031: insufficient privileges SQL> grant dba to test2;

Grant succeeded. SQL> connect test2/test Connected. SQL> grant references on test1.t1 to sys;

Grant succeeded. SQL> connect / as sysdba Connected. SQL> alter table t3 add constraint fk_t3 foreign key (object_id) references test1.t1(object_id);

Table altered

oracle中的references,Oracle 中的references权限相关推荐

  1. oracle触发器比较,Oracle使用触发器和mysql中使用触发器的比较

    一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志, ...

  2. 怎样给oracle表设置序列,Oracle的sequence序列在hibernate中的配置方法

    Oracle自增序列在Hibernate中的配置方法 在很多情况下,我们使用Hibernate在已经建立好数据库的基础上.在oracle中,如果已经建立好的数据库中使用了sequence,则可以按照下 ...

  3. oracle停止一切进程,oracle启动/停止的几种方法以及 启动和停止过程中出错的解决办法...

    一.启动几种方法: 1. sqlplus /nolog connect /as sysdba startup 2. sqlplus /nolog connect /as sysdba startup ...

  4. oracle中 怎么替换,oracle如何替换字符串?

    oracle替换字符串的方法:1.replce方法,代码为[REPLACE(sourceStr, searchStr, replacedStr)]:2.translate方法,代码为[TRANSLAT ...

  5. oracle函数胡书写,Oracle中序列表sequence的使用.docx

    Oracle中序列表sequence的使用 在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按 序列号排序的地方. 1. create sequence 你首先 ...

  6. oracle中DBWR全称,Oracle基本术语大全

    Oracle基本术语大全 §2.4.2 重做日志工作模式Oracle可以在两种模式之一来工作: 1)ARCHIVELOG模式(可恢复) Oracle 一般至少有两个日志文件.它们轮流交替地被写入所作的 ...

  7. 在Oracle中exception关键字,Oracle表字段有Oracle关键字出现异常解决方案

    一.问题由来 现在进行项目改造,数据库需要迁移,由原来的使用GBase数据库改为使用Oracle数据库,今天测试人员在测试时后台报了一个异常. 把SQL语句单独复制出来进行查询,还是报错,仔细分析原因 ...

  8. oracle中聚合比较函数,Oracle聚合函数/分析函数

    oracle函数分两类:单行函数.多行函数.多行函数又分为聚合函数.组合函数,参数为数组,数据大小为记录数,这种数组不是普通高级语言的数组,是一种虚拟数组,当记录数大时,会将数据写入硬盘,内存中放的只 ...

  9. 从oracle9i/92数据库中导出数据至 oracle 8.1.7 数据库中

    根据ORACLE官方文档的说明,一旦数据库创建后,数据库的字符集是不能改变的.因此,提前考虑自己的数据库将选用哪一种字符集 是十分重要的.数据库字符集选择的一般规则是将数据库字符集设定为操作系统本地字 ...

最新文章

  1. hibernate mysql 映射_使用hibernate建立mysql连接以及生成映射类和配置文件*.cfg.xml
  2. Effective user and Real user
  3. 皮一皮:确定不是备胎???
  4. 【数据结构与算法】之深入解析“石子游戏”的求解思路与算法示例
  5. Shell简介:什么是Shell,Shell命令的两种执行方式
  6. ubuntu下面pycharm设置pyspark的配置
  7. Java中lombok @Builder注解使用详解
  8. 自定义条件查询_数据查询不止有vlookup函数,自定义zlookup函数查询操作更高效...
  9. MongoDB 问题123
  10. Eclipse快捷键的使用
  11. Office Live Workspace让协同办公无处不在
  12. java 线程死锁简单例子_java 多线程死锁详解及简单实例
  13. 鼠标左键按住连发(不判断窗口)_零基础学习触摸屏之步科触摸屏软件窗口介绍...
  14. 婚姻是一场精神上的门当户对
  15. 五线谱软件测试初学者,学习五线谱(初学者专用).pdf
  16. 面试官:为什么选择做测试?我对测试特别感兴趣,我喜欢软件测试
  17. java 课设 商品库存管理系统
  18. 头像上传(限制大小,格式,尺寸)
  19. Django——admin功能、注册模型类、模型管理类
  20. 2022苹果春季发布会带来新款iPhoneSE价格预计2500左右

热门文章

  1. 关于#define _CRT_SECURE_NO_WARNINGS 1在打开vs2019时自动生成问题解决(使用Notepad++)
  2. m基于深度学习的LTE信号检测算法matlab仿真
  3. No such file or directory及解决方法
  4. Raphael JS
  5. 10行代码教你用Python扫描Excel表格,自动生成条形码!
  6. 收银系统连接授权服务器失败,超市收银系统错误-COMException 依赖服务或组无法启动(0x8007042C)处理办法...
  7. 17.在NBA我需要翻译-适配器模式(大话设计模式kotlin版)
  8. 8位单片机九齐NY8A054E
  9. CAD 随机卵石混凝土 混凝土细观 卵石混凝土模型
  10. 乖离率背离公式_股市偏离率怎么计算 公式是怎么样的?-BIAS-技术指标-股票入门基础知识学习网...