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

我已经在oracle中创建了一个用户,并将所有权限授予该用户,但是当我执行我的表时,我收到一个错误消息,表示权限不足,此表成功之前的所有表都是

这是特权:

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))
实现这一目标的更好方法:

  • 连接到A1_18019497_ADDB7311并运行脚本
  • 使用
    alter session set current_schema=A1_18019497_ADDB7311
    从高级用户运行脚本,而无需为所有引用对象添加前缀

  • 顺便说一句,有几个

    授予所有特权不是好的做法。显式地为用户提供他们所需的唯一特权。现在养成好习惯吧,你会很高兴你这么做的

    不要使用ORACLE脚本。这仅供Oracle使用。这在很大程度上适用于所有下划线参数,这些参数没有文档化,正是为了阻止人们使用它们。不幸的是,这也使它们对人们有吸引力,尤其是初学者。问题是,因为它们没有被记录在案,所以很容易忽略它们的副作用

    在本例中,ORACLE使用ORACLE脚本来标识其官方脚本。他们为什么需要它?设置参数将会话中创建的所有表标记为DBA_表中维护的ORACLE_。这对您的情况不好,因为它会导致混淆—您无法再将正式Oracle表与应用程序的表区分开来—并可能导致升级和其他系统维护活动出现问题。您没有从使用此参数中获得任何好处,但损坏了数据字典:这不是一个好交易


    不要在自己的脚本中使用此参数。通常不要使用下划线参数,除非您确切知道自己在做什么。互联网上有很多关于使用下划线参数的错误建议,这些建议来自不了解其含义的人。

    哪个用户正在运行此脚本?另外,您知道_ORACLE_脚本参数的作用吗?你不应该用它。几乎所有未记录的下划线参数都是如此。