如何将权限授予 Oracle SCHEMA 上的角色

Posted

技术标签:

【中文标题】如何将权限授予 Oracle SCHEMA 上的角色【英文标题】:How to GRANT privileges to a ROLE on an Oracle SCHEMA 【发布时间】:2012-10-13 18:05:41 【问题描述】:

如何在 SCHEMA 的所有表上向 ROLE 授予一些权限? 我写了这段代码,但是在 SQLDeveloper 中它给出了一个错误。

CREATE SCHEMA AUTHORIZATION alberto;

CREATE TABLE Cucine (
  tipo varchar(1) primary key,
  descrizione varchar(200) not null
);

CREATE TABLE Quartieri (
  codice varchar(4) primary key,
  nome varchar(100) not null
);

CREATE TABLE Ristoranti (
  codice varchar(5) primary key,
  nome varchar(150) not null,
  indirizzo varchar(250),
  tipocucina varchar(1) references Cucine(tipo),
  codquart varchar(4) references Quartieri(codice)
);

CREATE TABLE CarteDiCredito (
  codcircuito varchar(4) primary key,
  nomecircuito varchar(100) not null
);

CREATE TABLE Convenzioni (
  circuito varchar(4) references CarteDiCredito(codcircuito),
  codristorante varchar(5) references Ristoranti(codice),
  primary key(circuito, codristorante)
);

CREATE ROLE turista;
GRANT SELECT ON ENTE_TURISTICO.* TO turista;
CREATE USER DBAEnte IDENTIFIED BY 12345;
CREATE USER vinni IDENTIFIED BY mosh;
GRANT dba TO DBAEnte;
GRANT turista TO vinni;

这段代码有什么问题?

【问题讨论】:

创建模式在 Oracle 中“创建模式”。看看手册,里面都有解释。 【参考方案1】:

CREATE SCHEMA是单个语句创建多个对象,需要去掉分号。此外,CREATE SCHEMA 仅支持表、视图和授权。您需要将 CREATE ROLECREATE USER 从语句中移出。这是来自manual 的示例:

CREATE SCHEMA AUTHORIZATION oe
   CREATE TABLE new_product 
      (color VARCHAR2(10)  PRIMARY KEY, quantity NUMBER) 
   CREATE VIEW new_product_view 
      AS SELECT color, quantity FROM new_product WHERE color = 'RED' 
   GRANT select ON new_product_view TO hr; 

要在所有表上授予SELECT,您需要这样的动态 SQL:

begin
  for tables in (select table_name from all_tables where owner = 'ALBERTO') loop
    execute immediate
      'grant select on alberto.'||tables.table_name||' to turista';
  end loop;
end;
/

【讨论】:

所以,声明 GRANT SELECT ON ENTE_TURISTICO.* TO turista; 是非法的,因为我们不能使用ENTE_TURISTICO.* 的形式? (我记得我们在谈论 Oracle 上的 SQL)。 正确。据我所知,没有办法在一个GRANT 语句中直接授予多个对象的权限。请参阅此语法图:docs.oracle.com/cd/E11882_01/server.112/e26088/… 明白 :) 该代码直接取自我的书中,因此我无法解释为什么它不起作用.. 非常感谢您的帮助 :)【参考方案2】:

使用下面的代码:-

CREATE TABLESPACE dwtblspc LOGGING DATAFILE 'D:\oraclexe\app\oracle\oradata\XE\DWTBLSPC.DBF' SIZE 300M AUTOEXTEND ON NEXT 1048K MAXSIZE UNLIMITED;

CREATE USER prateek IDENTIFIED by prateek DEFAULT TABLESPACE dwtblspc ACCOUNT UNLOCK;

GRANT unlimited tablespace to prateek ;

CREATE ROLE prateek_role;

GRANT CREATE SESSION,ALTER SESSION,CREATE TABLE,CREATE CLUSTER,CREATE SYNONYM,CREATE VIEW,CREATE SEQUENCE,
CREATE DATABASE LINK,CREATE PROCEDURE,CREATE TRIGGER,CREATE TYPE,CREATE OPERATOR,CREATE INDEXTYPE,BACKUP ANY TABLE,
SELECT ANY TABLE,CREATE ANY TABLE,CREATE ANY INDEX,ALTER ANY INDEX,ALTER ANY INDEXTYPE,DROP ANY INDEX,DROP ANY INDEXTYPE to prateek_role;

GRANT prateek_role to prateek ;

希望对您有所帮助。

【讨论】:

以上是关于如何将权限授予 Oracle SCHEMA 上的角色的主要内容,如果未能解决你的问题,请参考以下文章

Oracle - 查询哪些权限被授予哪些对象上的哪些角色

单一模式上的雪花授予选择

授予对 Postgres 中所有表的访问权限

如何将现有用户的权限授予我在 Oracle 中创建的用户?谢谢

oracle中怎样让一个用户查询其它用户的trigger?

mysql:在 information_schema 上的访问被拒绝