Differenza tra un utente e uno schema in Oracle?


314

Qual è la differenza tra un utente e uno schema in Oracle?


17
+1 Mi sono sempre chiesto della distinzione: - /.
sleske,

9
Di seguito è riportato un interessante articolo che chiarisce tutti i dubbi: http://radiofreetooting.blogspot.com/2007/02/user-schema.html
Sandeep Jindal

9
Gli schemi Oracle sono come le cartelle Documenti nel sistema operativo Windows. Un utente può concedere autorizzazioni ad altri utenti per vedere le cose nel loro schema. Lo schema Oracle è essenzialmente un'area di lavoro di un utente.
Tarzan,

Risposte:


136

Da chiedere a Tom

Dovresti considerare uno schema come l'account utente e la raccolta di tutti gli oggetti in esso come uno schema a tutti gli effetti.

SCOTT è uno schema che include le tabelle EMP, DEPT e BONUS con varie concessioni e altre cose.

SYS è uno schema che include tonnellate di tabelle, viste, sovvenzioni, ecc. Ecc. Ecc.

SYSTEM è uno schema .....

Tecnicamente: uno schema è l'insieme di metadati (dizionario dei dati) utilizzato dal database, generalmente generato utilizzando DDL. Uno schema definisce gli attributi del database, come tabelle, colonne e proprietà. Uno schema di database è una descrizione dei dati in un database.


47
Dalla stessa pagina: a tutti gli effetti basta considerare user = schema = user = schema = la stessa cosa.
sengs

4
Ma posso avere due utenti usando lo stesso schema?
John John Pichler,

6
Se intendi "gli oggetti in un singolo schema possono essere" di proprietà "di più utenti", la risposta è No. Se intendi "gli oggetti in un singolo schema possono essere utilizzati da più utenti" la risposta è sicuramente Sì
Mahesh

95

Credo che il problema sia che Oracle usa il termine schema in modo leggermente diverso da ciò che generalmente significa.

  1. Lo schema di Oracle (come spiegato nella risposta di Nebakanezer): sostanzialmente l'insieme di tutte le tabelle e altri oggetti di proprietà di un account utente, quindi approssimativamente equivalente a un account utente
  2. Schema in generale: l'insieme di tutte le tabelle, sproc ecc. Che compongono il database per un determinato sistema / applicazione (come in "Gli sviluppatori dovrebbero discutere con i DBA sullo schema per la nostra nuova applicazione.")

Lo schema in senso 2 è simile, ma non è lo stesso in senso 1. Ad esempio, per un'applicazione che utilizza diversi account DB, uno schema in senso 2 potrebbe essere costituito da diversi schemi Oracle :-).

Inoltre lo schema può anche significare un sacco di altre cose abbastanza non correlate in altri contesti (ad es. In matematica).

Oracle avrebbe dovuto usare un termine come "userarea" o "accountobjects", anziché sovraccaricare "schema" ...


@djangofan Afaik questa domanda riguarda Oracle e non MS SQL.
Peter - Ripristina Monica il

62

Da WikiAnswers :

  • Uno schema è una raccolta di oggetti di database, incluse strutture logiche come tabelle, viste, sequenze, stored procedure, sinonimi, indici, cluster e collegamenti al database.
  • Un utente possiede uno schema.
  • Un utente e uno schema hanno lo stesso nome.
  • Il comando CREATE USER crea un utente. Inoltre crea automaticamente uno schema per quell'utente.
  • Il comando CREATE SCHEMA non crea uno "schema" come implica, ma consente solo di creare più tabelle e viste ed eseguire più concessioni nel proprio schema in un'unica transazione.
  • A tutti gli effetti, puoi considerare un utente come uno schema e uno schema come un utente.

Inoltre, un utente può accedere ad oggetti in schemi diversi dal proprio, se ha il permesso di farlo.


3
buon punto per CREARE SCHEMA - un nome scelto male per il comando, penso!
Jeffrey Kemp,

4
"Il comando CREATE SCHEMA non crea uno" schema "come implica". Penso che il 99% della confusione derivi da questo. E questo frammento di frase lo chiarisce molto bene. Grazie.
granadaCoder


Penso che questa sia la migliore risposta.
hagrawal,

50

Pensa a un utente come fai normalmente (nome utente / password con accesso per accedere e accedere ad alcuni oggetti nel sistema) e uno schema come la versione del database della home directory di un utente. L'utente "pippo" generalmente crea cose nello schema "pippo", ad esempio, se l'utente "pippo" crea o fa riferimento alla tabella "barra", Oracle supporrà che l'utente intenda "pippo.bar".


2
bella descrizione ma perché hai usato "pippo" sia per l'utente che per lo schema ?! Devono essere uguali?
JonnyRaa

In Oracle, USER è il nome dell'account, SCHEMA è l'insieme di oggetti di proprietà di quell'utente. Anche se, Oracle crea l'oggetto SCHEMA come parte dell'istruzione CREATE USER e SCHEMA ha lo stesso nome dell'UTENTE ma sono noti la stessa cosa. Naturalmente, la confusione deriva in parte dal fatto che esiste una corrispondenza uno a uno tra USER e SCHEMA e lo schema di un utente condivide il suo nome.
Mahesh,

17

Questa risposta non definisce la differenza tra un proprietario e uno schema, ma penso che si aggiunga alla discussione.

Nel mio piccolo mondo di pensiero:

Ho lottato con l'idea di creare un numero N di utenti in cui desidero che ciascuno di essi "consumi" (ovvero utilizzi) un singolo schema.

Tim su oracle-base.com mostra come farlo (avere N numero di utenti e ognuno di questi utenti verrà "reindirizzato" a un singolo schema.

Ha un secondo approccio "sinonimo" (non elencato qui). Sto solo citando la versione CURRENT_SCHEMA (uno dei suoi approcci) qui:

CURRENT_SCHEMA Approccio

Questo metodo utilizza l' CURRENT_SCHEMAattributo di sessione per indirizzare automaticamente gli utenti dell'applicazione allo schema corretto.

Innanzitutto, creiamo il proprietario dello schema e un utente dell'applicazione.

CONN sys/password AS SYSDBA

-- Remove existing users and roles with the same names.
DROP USER schema_owner CASCADE;
DROP USER app_user CASCADE;
DROP ROLE schema_rw_role;
DROP ROLE schema_ro_role;

-- Schema owner.
CREATE USER schema_owner IDENTIFIED BY password
  DEFAULT TABLESPACE users
  TEMPORARY TABLESPACE temp
  QUOTA UNLIMITED ON users;

GRANT CONNECT, CREATE TABLE TO schema_owner;

-- Application user.
CREATE USER app_user IDENTIFIED BY password
  DEFAULT TABLESPACE users
  TEMPORARY TABLESPACE temp;

GRANT CONNECT TO app_user;

Si noti che l'utente dell'applicazione può connettersi, ma non dispone di quote o privilegi di tablespace per creare oggetti.

Successivamente, creiamo alcuni ruoli per consentire l'accesso in lettura e scrittura e in sola lettura.

CREATE ROLE schema_rw_role;
CREATE ROLE schema_ro_role;

Vogliamo dare ai nostri utenti dell'applicazione l'accesso in lettura e scrittura agli oggetti dello schema, quindi garantiamo il ruolo rilevante.

GRANT schema_rw_role TO app_user;

Dobbiamo assicurarci che l'utente dell'applicazione abbia il suo schema predefinito che punta al proprietario dello schema, quindi creiamo un trigger AFTER LOGON per farlo per noi.

CREATE OR REPLACE TRIGGER app_user.after_logon_trg
AFTER LOGON ON app_user.SCHEMA
BEGIN
  DBMS_APPLICATION_INFO.set_module(USER, 'Initialized');
  EXECUTE IMMEDIATE 'ALTER SESSION SET current_schema=SCHEMA_OWNER';
END;
/

Ora siamo pronti per creare un oggetto nel proprietario dello schema.

CONN schema_owner/password

CREATE TABLE test_tab (
  id          NUMBER,
  description VARCHAR2(50),
  CONSTRAINT test_tab_pk PRIMARY KEY (id)
);

GRANT SELECT ON test_tab TO schema_ro_role;
GRANT SELECT, INSERT, UPDATE, DELETE ON test_tab TO schema_rw_role;

Notare come i privilegi vengono concessi ai ruoli pertinenti. Senza questo, gli oggetti non sarebbero visibili all'utente dell'applicazione. Ora abbiamo un proprietario dello schema e un utente dell'applicazione funzionanti.

SQL> CONN app_user/password
Connected.
SQL> DESC test_tab
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 ID                                                    NOT NULL NUMBER
 DESCRIPTION                                                    VARCHAR2(50)

SQL>

Questo metodo è ideale laddove l'utente dell'applicazione sia semplicemente un punto di ingresso alternativo allo schema principale, che non richiede oggetti propri.


1
Si noti che l'uso dei ruoli potrebbe non risolvere i problemi di autorizzazione per il codice PL / SQL. Le concessioni di oggetti ai ruoli non vengono propagate in modo intuitivo quando vengono eseguite le procedure memorizzate. Tuttavia, ho votato a favore di questa risposta perché questo approccio è davvero eccezionale, ma è poco conosciuto e usato raramente per quanto ne so.
Andrew Wolfe,

15

È molto semplice.

If USER has OBJECTS
then call it SCHEMA
else
     call it USER
end if;

Un utente può avere accesso agli oggetti dello schema di proprietà di diversi utenti.


1
In realtà la confusione viene creata quando le persone chiamano - L'utente è uno schema. Come utente potrebbe non essere lo schema come spiegato. Un utente potrebbe semplicemente essere un utente che accede ad altri schemi utente.
Sandeep Jindal,

3

Lo schema è un incapsulamento di DB.objects su un'idea / dominio di interesse e di proprietà di UN utente. Sarà quindi condiviso da altri utenti / applicazioni con ruoli soppressi. Pertanto, gli utenti non devono possedere uno schema, ma uno schema deve avere un proprietario.


1

Un account utente è come un parente che detiene una chiave di casa, ma non possiede nulla, ovvero un account utente non possiede alcun oggetto di database ... nessun dizionario di dati ...

Considerando che uno schema è un incapsulamento di oggetti di database. È come il proprietario della casa che possiede tutto nella tua casa e un account utente sarà in grado di accedere alle merci a casa solo quando il proprietario, cioè lo schema, le concede le sovvenzioni necessarie.


1

--USER e SCHEMA

Sia le parole utente che lo schema sono intercambiabili, ecco perché la maggior parte delle persone confonde su queste parole di seguito ho spiegato la differenza tra loro

- L'utente è un account per la connessione al database (server). possiamo creare l'utente usando CREATE USER nome_utente IDENTIFICATO DA password.

--Schema

In realtà Oracle Database contiene una struttura logica e fisica per elaborare i dati. Lo schema inoltre la struttura logica per elaborare i dati nel database (componente di memoria). È creato automaticamente da Oracle quando creato dall'utente. Contiene tutti gli oggetti creati dall'utente associato a quello schema. Ad esempio, se ho creato un utente con il nome santhosh, Oracle crea uno schema chiamato santhosh, oracle archivia tutti gli oggetti creati dall'utente santhosh in santhosh schema.

È possibile creare uno schema mediante l'istruzione CREATE SCHEMA, ma Oracle crea automaticamente un utente per quello schema.

È possibile eliminare lo schema utilizzando l'istruzione DROP SCHEMA nome_schama RESTRICT ma non è possibile eliminare scehema contiene oggetti, quindi per eliminare lo schema deve essere vuoto.qui la parola di limitazione specifica forzatamente quello schema senza oggetti.

Se proviamo a eliminare un utente contenente oggetti nel suo schema, dobbiamo specificare la parola CASCADE perché oracle non ti consente di eliminare gli oggetti utente contenuti. DROP USER nome_utente CASCADE, quindi l'oracolo elimina gli oggetti nello schema e quindi rilascia automaticamente l'utente, gli oggetti a cui si fa riferimento a questo schema da altri schemi come visualizzazioni e sinonimi privati ​​passano allo stato non valido.

Spero che ora tu abbia la differenza tra loro, se hai dei dubbi su questo argomento, non esitare a chiedere.

Grazie.


0

Gli utenti di uno schema e di un database sono uguali ma se lo schema possiede oggetti di database e possono fare qualsiasi cosa il loro oggetto ma l'utente accede semplicemente agli oggetti, non possono fare alcuna operazione DDL fino a quando l'utente dello schema non ti dà i privilegi adeguati.


0

Sulla base della mia scarsa conoscenza di Oracle ... un USER e uno SCHEMA sono in qualche modo simili. Ma c'è anche una grande differenza. Un UTENTE può essere chiamato SCHEMA se "UTENTE" possiede un oggetto, altrimenti ... rimarrà solo un "UTENTE". Una volta che l'UTENTE possiede almeno un oggetto, in virtù di tutte le tue definizioni sopra ... l'UTENTE può ora essere chiamato SCHEMA.


0

Utente: accesso alla risorsa del database. Come una chiave per entrare in una casa.

Schema: raccolta di informazioni sugli oggetti del database. Come Index nel tuo libro che contiene le brevi informazioni sul capitolo.

Guarda qui per i dettagli


0

Per la maggior parte delle persone che hanno più familiarità con MariaDB o MySQL questo sembra poco confuso perché in MariaDB o MySQL hanno schemi diversi (che include diverse tabelle, vista, blocchi PLSQL e oggetti DB ecc.) E gli UTENTI sono gli account che possono accedere a quelli schema. Pertanto, nessun utente specifico può appartenere a uno schema particolare. L'autorizzazione deve essere data a quello schema, quindi l'utente può accedervi. Gli utenti e lo schema sono separati in database come MySQL e MariaDB.

In Oracle schema e gli utenti sono quasi trattati allo stesso modo. Per lavorare con quello schema devi avere l'autorizzazione che è dove sentirai che il nome dello schema non è altro che il nome utente. Le autorizzazioni possono essere concesse attraverso schemi per accedere a diversi oggetti di database da schemi diversi. In Oracle possiamo dire che un utente possiede uno schema perché quando crei un utente crei oggetti DB per esso e viceversa.


-1

Lo schema è un contenitore di oggetti. È di proprietà di un utente.


1
Ciò implica che un utente può possedere più schemi. Non credo sia possibile (in Oracle); mentre l'utente Apuò avere diritti di amministratore completi sullo schema B, quest'ultimo sarà sempre di proprietà dell'utente B, anche se nessuno accederà mai con tale nome utente.

-1

Bene, ho letto da qualche parte che se l'utente del tuo database ha i privilegi DDL, allora è uno schema, altrimenti è un utente.


Questa è in realtà una distinzione utile - utenti con privilegi CREATE distinti da quelli senza privilegi CREATE
Andrew Wolfe
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.