Obecně řečeno, schéma v oracle je stejné jako uživatel. Oracle Database automaticky vytvoří schéma, když vytvoříte uživatele. Soubor s příponou DDL je soubor SQL Data Definition Language.
Vytvoření nového uživatele (pomocí SQL Plus)
Základní příkazy SQL Plus:
- connect: connects to a database
- disconnect: logs off but does not exit
- exit: exists
Otevřete SQL Plus a přihlaste se:
/ as sysdba
Sysdba je role a je jako "root" na unixu nebo "administrátor" na Windows. Všechno vidí, všechno umí. Pokud se interně připojíte jako sysdba, název vašeho schématu bude vypadat jako SYS.
Vytvořte uživatele:
SQL> create user johny identified by 1234;
Zobrazte všechny uživatele a zkontrolujte, zda je tam uživatel johny:
SQL> select username from dba_users;
Pokud se nyní pokusíte přihlásit jako johny, zobrazí se chyba:
ERROR:
ORA-01045: user JOHNY lacks CREATE SESSION privilege; logon denied
Uživatel, který se chce přihlásit, potřebuje alespoň vytvořit privilegium relace, takže toto oprávnění musíme uživateli udělit:
SQL> grant create session to johny;
Nyní se můžete připojit jako uživatel johny:
username: johny
password: 1234
Chcete-li se uživatele zbavit, můžete jej zahodit:
SQL> drop user johny;
To byl základní příklad, jak vytvořit uživatele. Může to být složitější. Výše jsme vytvořili uživatele, jehož objekty jsou uloženy ve výchozím tabulkovém prostoru databáze. Aby byla databáze uklizená, měli bychom umístit objekty uživatele do jeho vlastního prostoru (tabulkový prostor je alokace prostoru v databázi, která může obsahovat objekty schématu).
Zobrazit již vytvořené tabulkové prostory:
SQL> select tablespace_name from dba_tablespaces;
Vytvořit tabulkový prostor:
SQL> create tablespace johny_tabspace
2 datafile 'johny_tabspace.dat'
3 size 10M autoextend on;
Vytvořte dočasný tabulkový prostor (Dočasný tabulkový prostor je alokace prostoru v databázi, která může obsahovat přechodná data, která přetrvávají pouze po dobu trvání relace. Tato přechodná data nelze obnovit po selhání procesu nebo instance.):
SQL> create temporary tablespace johny_tabspace_temp
2 tempfile 'johny_tabspace_temp.dat'
3 size 5M autoextend on;
Vytvořte uživatele:
SQL> create user johny
2 identified by 1234
3 default tablespace johny_tabspace
4 temporary tablespace johny_tabspace_temp;
Udělte některá oprávnění:
SQL> grant create session to johny;
SQL> grant create table to johny;
SQL> grant unlimited tablespace to johny;
Přihlaste se jako johny a zkontrolujte, jaká má oprávnění:
SQL> select * from session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
S oprávněním vytvořit tabulku může uživatel vytvářet tabulky:
SQL> create table johny_table
2 (
3 id int not null,
4 text varchar2(1000),
5 primary key (id)
6 );
Vložit data:
SQL> insert into johny_table (id, text)
2 values (1, 'This is some text.');
Vyberte:
SQL> select * from johny_table;
ID TEXT
--------------------------
1 This is some text.
Chcete-li získat data DDL, můžete použít balíček DBMS_METADATA, který "poskytuje způsob, jak získat metadata z databázového slovníku jako XML nebo vytvoření DDL a odeslat XML pro opětovné vytvoření objektu.".(s pomocí http://www.dba-oracle.com/oracle_tips_dbms_metadata.htm )
Pro tabulku:
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;
Výsledek:
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"
Pro index:
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;
Výsledek:
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"
Další informace:
DDL
DBMS_METADATA
- http://www.dba-oracle.com/t_1_dbms_metadata.htm
- http://docs.oracle. com/cd/E11882_01/appdev.112/e25788/d_metada.htm#ARPLS026
- http://docs.oracle. com/cd/B28359_01/server.111/b28310/general010.htm#ADMIN11562
Objekty schématu
Rozdíly mezi schématem a uživatelem
- https://dba. stackexchange.com/questions/37012/difference-between-database-vs-user-vs-schema
- Rozdíl mezi uživatelem a schéma v Oracle?
Privilegia
Vytvoření uživatele/schéma
- http://docs.oracle.com/ cd/B19306_01/server.102/b14200/statements_8003.htm
- http://www.techonthenet.com/oracle/schemas/create_schema. php
Vytvoření tabulkového prostoru
SQL Plus příkazy