Oracle 甲骨文及;引用所有用户(用户名)
因此,我需要从Employee表(ideemployee、name等)映射到创建了帐户的真实用户。我决定添加一个表映射\u Employee\u User(ideemployee,userName),如下所示Oracle 甲骨文及;引用所有用户(用户名),oracle,foreign-keys,ora-01031,Oracle,Foreign Keys,Ora 01031,因此,我需要从Employee表(ideemployee、name等)映射到创建了帐户的真实用户。我决定添加一个表映射\u Employee\u User(ideemployee,userName),如下所示 CREATE TABLE Mapping_Employee_User( idEmployee NUMBER(6) CONSTRAINT FK_Mapping_Employee_User1 REFERENCES Employee (idEmployee),
CREATE TABLE Mapping_Employee_User(
idEmployee NUMBER(6)
CONSTRAINT FK_Mapping_Employee_User1 REFERENCES Employee (idEmployee),
userName VARCHAR2(30 BYTE)
CONSTRAINT FK_Mapping_Employee_User2 REFERENCES ALL_USERS(USERNAME),
CONSTRAINT PK_Mapping_Employee_User PRIMARY KEY (idEmployee, userName)
);
但是我得到了一个“ORA01031权限不足”原因:有人试图更改当前用户名或密码…”但我并没有这样做,我只是想做一个参考
请注意:我对该用户拥有完全权限
登录为SYS我可以看到实际的表名为“USER$”,我找不到表中的所有用户…无论如何,我如何进行这种引用???
所有用户和用户$
都是系统表/视图。它们由Oracle自己维持在较低的级别。级别太低,无法实施这些约束。你根本不能做你想做的事
(这样想:如果您试图删除用户bob
,会发生什么?您希望Oracle强制执行您的外键约束吗?如果您的用户表空间处于脱机状态,会发生什么情况?)
编辑:我建议你把用户名上的外键去掉。您可能希望安排一些作业来比较Mapping\u Employee\u User
中的用户与DBA\u用户
中的用户,以确保它们保持同步。或者,您可能希望使用LDAP(我听说这是可能的)来管理Oracle用户。所有用户本身都是一个视图,而不是一个表
将所有用户上的select授予用户名代码>
应该足够了。如果您仍然获得ORA-01031,可能是因为用户没有CREATE TABLE权限:
将创建表授予用户名代码>我更改了一行,现在得到一个较小的错误:CONSTRAINT-CONSTRAINT-FK\u-Mapping\u-Employee\u-User2引用SYS.USER$(NAME)。现在它只是说表不存在,但这个选择工作得很好:从SYS.USER$中选择名称。。。那又怎么样?我怎么能跳过这一步?@IftimieVlad:文档上说你根本不应该碰SYS.USER$。我怀疑有没有办法避免这个错误。至少这不是一种足够理智的思考方式(我的意思是,只要你在处理数据字典,也许你可以找到约束是如何存储的,并直接插入它。但不要这样做。)。是的,你是对的。。。我决定使用没有引用部分的表。我已经拥有第一个用户的所有角色(在我创建他时授予他所有角色)。请看下面。我添加了一些东西只是为了安全起见-创建一个表,看看它是否有效