如何在Oracle模式上向一个角色授予权限

3

如何将一些权限授予架构中所有表的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;

这段代码有什么问题?

1
在Oracle中创建模式不会真正“创建一个模式”。请查看手册,里面有详细解释。 - user330315
2个回答

6

CREATE SCHEMA是一个创建多个对象的单一语句,你需要删除分号。此外,CREATE SCHEMA只支持表格、视图和授权。你需要将CREATE ROLECREATE USER移出语句。以下是来自手册的示例:

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)。 - Overflowh
1
正确。据我所知,在一个“GRANT”语句中没有直接授予多个对象权限的方法。请参阅此语法图:http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_9013.htm#i2123618 - Jon Heller
明白了 :) 那段代码是直接从我的书中摘录的,因此我无法解释为什么它不起作用。非常感谢您的帮助 :) - Overflowh

0
使用以下代码:-
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 ;

希望它有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接