oracle中的特权
我已经在oracle中创建了一个用户,并将所有权限授予该用户,但是当我执行我的表时,我收到一个错误消息,表示权限不足,此表成功之前的所有表都是 这是特权:oracle中的特权,oracle,Oracle,我已经在oracle中创建了一个用户,并将所有权限授予该用户,但是当我执行我的表时,我收到一个错误消息,表示权限不足,此表成功之前的所有表都是 这是特权: alter session set "_ORACLE_SCRIPT"=true; create USER A1_18019497_ADDB7311 identified by Sileshan1234; Grant all PRIVILEGES to A1_18019497_ADDB7311; SELECT use
alter session set "_ORACLE_SCRIPT"=true;
create USER A1_18019497_ADDB7311 identified by Sileshan1234;
Grant all PRIVILEGES to A1_18019497_ADDB7311;
SELECT username, account_status FROM dba_users
这是我的桌子:
--创建表帐单
CREATE TABLE A1_18019497_ADDB7311.BILLING(
BillID INT NOT NULL,
CustomerID INT REFERENCES CUSTOMER(CustomerID),
BillDate DATE NOT NULL,
EmployeeID VARCHAR(6) REFERENCES EMPLOYEE(EmployeeID),
PRIMARY KEY(BillID));
这就是错误:
Error starting at line : 62 in command -
CREATE TABLE A1_18019497_ADDB7311.BILLING(
BillID INT NOT NULL,
CustomerID INT REFERENCES CUSTOMER(CustomerID),
BillDate DATE NOT NULL,
EmployeeID VARCHAR(6) REFERENCES EMPLOYEE(EmployeeID),
PRIMARY KEY(BillID))
Error report -
ORA-01031: insufficient privileges
01031. 00000 - "insufficient privileges"
*Cause: An attempt was made to perform a database operation without
the necessary privileges.
*Action: Ask your database administrator or designated security
administrator to grant you the necessary privileges
您必须单独授予
创建表
权限,它不包括在所有权限中
顺便说一下,我建议你不要那样做。不要授予不必要的特权,特别是如果你不知道谁以及如何使用它们。仅在需要时逐个授予所需的特权。如果需要,请创建一个角色并将这些权限授予角色,然后将角色授予用户 此表之前的所有表都成功 所以脚本中还有其他CREATETABLE语句,但就是这个语句失败了 那么问题不在于授予所有特权。(由于其他原因,这是有问题的) 查看您的语句,我注意到您在表名前面加了模式名:
CREATE TABLE A1_18019497_ADDB7311.BILLING
CREATE TABLE A1_18019497_ADDB7311.BILLING(
BillID INT NOT NULL,
CustomerID INT REFERENCES A1_18019497_ADDB7311.CUSTOMER(CustomerID),
BillDate DATE NOT NULL,
EmployeeID VARCHAR(6) REFERENCES A1_18019497_ADDB7311.EMPLOYEE(EmployeeID),
PRIMARY KEY(BillID))
这是否意味着您正在从另一个用户(例如SYS或其他DBA帐户)运行脚本?如果是这样的话,这或许可以解释这个问题
您的账单表有两个外键,但引用没有在表名前加上模式前缀。这意味着Oracle将不会引用A1_18019497_ADDB7311中的表,而是引用正在运行的模式或已授予公共权限的其他模式中的表。问题是,授予所有特权授予系统特权和任何对象特权,但不授予单个对象的特权。要针对另一个模式中的表创建外键,需要该模式授予您对该表的引用权限
或者,如果您确实希望将外键保留在您尝试创建的架构中,则需要在外键子句前面加上架构名称:
CREATE TABLE A1_18019497_ADDB7311.BILLING
CREATE TABLE A1_18019497_ADDB7311.BILLING(
BillID INT NOT NULL,
CustomerID INT REFERENCES A1_18019497_ADDB7311.CUSTOMER(CustomerID),
BillDate DATE NOT NULL,
EmployeeID VARCHAR(6) REFERENCES A1_18019497_ADDB7311.EMPLOYEE(EmployeeID),
PRIMARY KEY(BillID))
实现这一目标的更好方法:
alter session set current_schema=A1_18019497_ADDB7311
从高级用户运行脚本,而无需为所有引用对象添加前缀顺便说一句,有几个 授予所有特权不是好的做法。显式地为用户提供他们所需的唯一特权。现在养成好习惯吧,你会很高兴你这么做的 不要使用ORACLE脚本。这仅供Oracle使用。这在很大程度上适用于所有下划线参数,这些参数没有文档化,正是为了阻止人们使用它们。不幸的是,这也使它们对人们有吸引力,尤其是初学者。问题是,因为它们没有被记录在案,所以很容易忽略它们的副作用 在本例中,ORACLE使用ORACLE脚本来标识其官方脚本。他们为什么需要它?设置参数将会话中创建的所有表标记为DBA_表中维护的ORACLE_。这对您的情况不好,因为它会导致混淆—您无法再将正式Oracle表与应用程序的表区分开来—并可能导致升级和其他系统维护活动出现问题。您没有从使用此参数中获得任何好处,但损坏了数据字典:这不是一个好交易
不要在自己的脚本中使用此参数。通常不要使用下划线参数,除非您确切知道自己在做什么。互联网上有很多关于使用下划线参数的错误建议,这些建议来自不了解其含义的人。哪个用户正在运行此脚本?另外,您知道_ORACLE_脚本参数的作用吗?你不应该用它。几乎所有未记录的下划线参数都是如此。