In generale, uno schema in Oracle è lo stesso di un utente. Oracle Database crea automaticamente uno schema quando crei un utente. Un file con estensione DDL è un file SQL Data Definition Language.
Creazione di un nuovo utente (utilizzando SQL Plus)
Comandi SQL Plus di base:
- connect: connects to a database
- disconnect: logs off but does not exit
- exit: exists
Apri SQL Plus e accedi:
/ as sysdba
Il sysdba è un ruolo ed è come "root" su unix o "Administrator" su Windows. Vede tutto, può fare tutto. Internamente, se ti connetti come sysdba, il nome dello schema apparirà come SYS.
Crea un utente:
SQL> create user johny identified by 1234;
Visualizza tutti gli utenti e controlla se l'utente johny è presente:
SQL> select username from dba_users;
Se provi ad accedere come johny ora riceverai un errore:
ERROR:
ORA-01045: user JOHNY lacks CREATE SESSION privilege; logon denied
L'utente per accedere deve almeno creare privilegi di sessione, quindi dobbiamo concedere questi privilegi all'utente:
SQL> grant create session to johny;
Ora puoi connetterti come utente johny:
username: johny
password: 1234
Per sbarazzarti dell'utente puoi rilasciarlo:
SQL> drop user johny;
Quello era un esempio di base per mostrare come creare un utente. Potrebbe essere più complesso. Sopra abbiamo creato un utente i cui oggetti sono archiviati nel tablespace predefinito del database. Per avere un database ordinato dovremmo posizionare gli oggetti degli utenti nel suo spazio (il tablespace è un'allocazione di spazio nel database che può contenere oggetti dello schema).
Mostra spazi tabelle già creati:
SQL> select tablespace_name from dba_tablespaces;
Crea spazio tabella:
SQL> create tablespace johny_tabspace
2 datafile 'johny_tabspace.dat'
3 size 10M autoextend on;
Crea spazio tabella temporaneo (lo spazio tabella temporaneo è un'allocazione di spazio nel database che può contenere dati temporanei che persistono solo per la durata di una sessione. Questi dati temporanei non possono essere ripristinati dopo un errore del processo o dell'istanza.):
SQL> create temporary tablespace johny_tabspace_temp
2 tempfile 'johny_tabspace_temp.dat'
3 size 5M autoextend on;
Crea l'utente:
SQL> create user johny
2 identified by 1234
3 default tablespace johny_tabspace
4 temporary tablespace johny_tabspace_temp;
Concedi alcuni privilegi:
SQL> grant create session to johny;
SQL> grant create table to johny;
SQL> grant unlimited tablespace to johny;
Accedi come johny e controlla quali privilegi ha:
SQL> select * from session_privs;
PRIVILEGE
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
Con il privilegio di creazione della tabella l'utente può creare tabelle:
SQL> create table johny_table
2 (
3 id int not null,
4 text varchar2(1000),
5 primary key (id)
6 );
Inserisci dati:
SQL> insert into johny_table (id, text)
2 values (1, 'This is some text.');
Selezionare:
SQL> select * from johny_table;
ID TEXT
1 This is some text.
Per ottenere dati DDL è possibile utilizzare il pacchetto DBMS_METADATA che "fornisce un modo per recuperare i metadati dal dizionario del database come XML o DDL di creazione e per inviare l'XML per ricreare l'oggetto". (con l'aiuto di http://www.dba-oracle.com/oracle_tips_dbms_metadata.htm )
Per tavolo:
SQL> set pagesize 0
SQL> set long 90000
SQL> set feedback off
SQL> set echo off
SQL> SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name) FROM USER_TABLES u;
Risultato:
CREATE TABLE "JOHNY"."JOHNY_TABLE"
( "ID" NUMBER(*,0) NOT NULL ENABLE,
"TEXT" VARCHAR2(1000),
PRIMARY KEY ("ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DE
FAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "JOHNY_TABSPACE" ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DE
FAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "JOHNY_TABSPACE"
Per indice:
SQL> set pagesize 0
SQL> set long 90000
SQL> set feedback off
SQL> set echo off
SQL> SELECT DBMS_METADATA.GET_DDL('INDEX',u.index_name) FROM USER_INDEXES u;
Risultato:
CREATE UNIQUE INDEX "JOHNY"."SYS_C0013353" ON "JOHNY"."JOHNY_TABLE" ("ID")
PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DE
FAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "JOHNY_TABSPACE"
Maggiori informazioni:
DDL
DBMS_METADATA
Oggetti dello schema
Differenze tra schema e utente
Privilegi
Creazione utente / schema
Creazione di tablespace
Comandi SQL Plus
create user foo ...
. Si prega di leggere il manuale-