【问题标题】:Privileges in oracleoracle 中的权限
【发布时间】:2020-10-05 06:20:47
【问题描述】:

我在 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 

这是我的桌子: --创建表Billing

    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

【问题讨论】:

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

标签: oracle


【解决方案1】:

此表成功前的所有表

所以脚本中还有其他 CREATE TABLE 语句,而只有这个语句失败了?

那么问题不在于 GRANT ALL PRIVILEGES。 (由于其他原因,这是有问题的)。

查看您的声明,我注意到您在表名前加上架构名称:

CREATE TABLE A1_18019497_ADDB7311.BILLING

这是否意味着您正在从另一个用户(例如 SYS 或其他 DBA 帐户)运行脚本?如果是这样,那可能会解释这个问题。

您的 BILLING 表有两个外键,但引用没有在表名前面加上架构。这意味着 Oracle 不会引用 A1_18019497_ADDB7311 中的表,而是引用正在运行的模式或其他已授予公共权限的模式中的表。问题是,GRANT ALL PRIVILEGES 授予系统权限和任何对象权限,但不授予单个对象的权限。要针对另一个架构中的表创建外键,您需要该架构授予您对该表的 REFERENCES 权限。

或者,如果您真正想要的是将外键保留在您尝试创建的架构中,您需要在外键子句前面加上架构名称:

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))

实现这一目标的更好方法:

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

顺便说一句。

GRANT ALL PRIVILEGES 不是好的做法。明确授予用户他们需要的唯一权限。现在养成好习惯,你会很高兴的。

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

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

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

【讨论】:

    【解决方案2】:

    您必须单独授予CREATE TABLE 权限,它不包含在all privileges 中。


    顺便说一句,我建议你不要那样做。不要授予不必要的特权,特别是如果您不知道谁以及如何(ab)使用它们。仅在需要时逐一授予所需的权限。如果您愿意,可以创建一个角色并将这些权限授予一个角色,然后将角色授予您的用户。

    【讨论】:

      猜你喜欢
      • 2011-11-02
      • 2015-10-29
      • 1970-01-01
      • 2020-03-29
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多