1. CREATE USER
Nedan visas syntaxen för kommandot CREATE USER:
CREATE USER username
IDENTIFIED {BY password | EXTERNALLY | GLOBALLY AS 'external_name'}
options;
options:
DEFAULT TABLESPACE tablespace
TEMPORARY TABLESPACE tablespace
QUOTA int {K | M} ON tablespace
QUOTA UNLIMITED ON tablespace
PROFILE profile_name
PASSWORD EXPIRE
ACCOUNT {LOCK|UNLOCK}
|
2. CREATE USER: Exempel 1
Endast en användare som har privilegiet "CREATE USER" kan skapa en användare. Detta privilegie är det vanligtvis bara adminstratören som har. Både användaren SYS och SYSTEM har rätt att skapa användare, vi använder SYSTEM för detta. Nedan skapar jag användaren olle:
[olle@dev1]$ sqlplus system/oracle
SQL> CREATE USER olle IDENTIFIED BY oracle;
User created.
|
Användaren OLLE har nu lösenordet "oracle". Om vi tänker oss att OLLE vill logga in och skapa tabellen "hej" kommer vi stöta på en rad problem. Detta eftersom Oracle inte tillåter en användare utan rättigheter att göra speciellt mycket, se nedan:
3. Inget "CREATE SESSION" privilegie
När OLLE försöker logga in händer följande:
SQL> CONNECT olle/oracle
ERROR:
ORA-01045: user OLLE lacks CREATE SESSION privilege; logon denied
Warning: You are no longer connected to ORACLE.
|
OLLE kan nu inte logga in eftersom OLLE saknar alla rättigheter. För att logga in krävs privilegiet "CREATE SESSION" (mer om privilegier på
Privilegier ). Vi tilldelar OLLE denna rättighet.
SQL> CONNECT system/oracle
Connected.
SQL> GRANT create session TO olle;
Grant succeeded.
SQL> CONNECT olle/oracle
Connected.
|
Nu gick det bättre..
4. Inget "CREATE TABLE" privilegie
När OLLE försöker skapa tabellen "hej" händer följande:
SQL> CONNECT olle/oracle
Connected.
SQL> CREATE TABLE hej (a VARCHAR2(10));
CREATE TABLE hej (a VARCHAR2(10))
*
ERROR at line 1:
ORA-01031: insufficient privileges
|
OLLE kan nu inte skapa tabellen eftersom han saknar privilegiet "CREATE TABLE". Vi tilldelar honom det:
SQL> CONNECT system/oracle
Connected.
SQL> GRANT create table TO olle;
Grant succeeded.
|
5. Inget "QUOTA"
Vi gör nu ett nytt försök att skapa tabellen "hej":
SQL> CONNECT olle/oracle
Connected.
SQL> CREATE TABLE hej (a VARCHAR2(10));
CREATE TABLE hej (a VARCHAR2(10))
*
ERROR at line 1:
ORA-01950: no privileges on tablespace 'SYSTEM'
|
Här har vi egentligen två problem:
- OLLE har ingen "QUOTA": OLLE har inte rätt att använda något tabellutrymme eftersom han inte har blivit tilldelad något utrymme i något tabellutrymme. Alltså: även om han har rätt att skapa en tabell (med privilegiet CREATE TABLE) så har han inget tabellutrymme att göra det i.
- Tabellen skapas i "SYSTEM": Oracle försöker skapa tabellen i tabellutrymmet "SYSTEM". Tabellutrymmet "SYSTEM" används för Oracles interna data och ska absolut inte anvädas av vanliga användare. Vi måste alltså ge OLLE ett "DEFAULT TABLESPACE" så att han inte av misstag råkar skapa tabeller i "SYSTEM".
Vi rättar dessa problem genom att utföra "ALTER USER":
SQL> CONNECT system/oracle
Connected.
SQL> ALTER USER olle
DEFAULT TABLESPACE app1_data01
QUOTA 100M ON app1_data01
QUOTA 100M ON app1_idx01;
User altered.
|
Nu har OLLE 100MB utrymme både på tabellutrymmet "APP1_DATA01" och "APP1_IDX01". Vi testar att skapa tabellen "hej" (för sista gången):
SQL> CONNECT olle/oracle
Connected.
SQL> CREATE TABLE hej (a VARCHAR2(10));
Table created.
SQL> INSERT INTO hej VALUES('Hej alla');
1 row created.
SQL> COMMIT;
Commit complete.
|
Nu gick det bra. Nu ska vi dubbelkolla vilket tabellutrymme "hej" hamnade i:
SQL> SELECT table_name, tablespace_name FROM user_tables;
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
HEJ APP1_DATA01
|
6. CREATE USER: Exempel 2
Nu ska vi skapa en användare "APP1" som ska lagra data i tabellutrymmet "APP1_DATA01". Vi använder nu "DEFAULT TABLESPACE" för att se till att användaren APP1 per default skapar tabller i APP1_DATA01.
- Observera att det sällan är en bra idé att skapa en användare utan "DEFAULT TABLESPACE", eftersom det då finns risk att användaren skapar tabeller som hamnar i tabellutrymmet "SYSTEM".
Vi försöker igen, och skapar nu användaren "APP1":
SQL> CONNECT system/oracle
Connected.
SQL> CREATE USER app1 IDENTIFIED BY oracle
DEFAULT TABLESPACE app1_data01
QUOTA UNLIMITED ON app1_data01
QUOTA UNLIMITED ON app1_idx01;
User created.
|
Nu har vi skapat APP1.
- OBS: Vi gav APP1 obegränsat utrymme på tabellutrymmet "app1_idx01", eftersom vi vill att APP1 ska lagra sina index i detta tabellutrymme (ger bättre prestanda på IO).
APP1 har ännu inga rättigheter, så APP1 kan varken logga in eller skapa några databasobjekt. Denna gång använder vi roller för att tilldela användaren privilegier. Roller gör att det går lite snabbare att ge APP1 ett startpaket av privilegier:
SQL> GRANT connect TO app1;
Grant succeeded.
SQL> GRANT resource TO app1;
Grant succeeded.
|
Rollerna:
- Den första rollen "CONNECT" innehåller bara privilegiet "CREATE SESSION".
- Rollen "RESOURCE" låter APP1 skapa en mängd databasobjekt i sitt eget schema.
Nu ska vi se om APP1 kan logga in och skapa tabeller:
SQL> CONNECT app1/oracle
Connected.
SQL> CREATE TABLE dep(
dep_pk NUMBER(10),
dep_name VARCHAR(100) NOT NULL
);
Table created.
SQL> CREATE TABLE emp(
emp_pk NUMBER(10),
dep_pk NUMBER(10),
first_name VARCHAR2(100) NOT NULL,
last_name VARCHAR2(100) NOT NULL,
salary NUMBER(10),
id_nr CHAR(10)
);
Table created.
|
Det gick bra, men i vilket tabellutrymme hamnade tabellerna?
SQL> SELECT table_name, tablespace_name FROM user_tables;
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
EMP APP1_DATA01
DEP APP1_DATA01
|
Vi testar att skapa några index:
SQL> ALTER TABLE dep ADD (
CONSTRAINT cons_pk_dep
PRIMARY KEY (dep_pk)
USING INDEX
TABLESPACE app1_idx01
);
Table altered.
SQL> ALTER TABLE emp ADD (
CONSTRAINT cons_pk_emp
PRIMARY KEY (emp_pk)
USING INDEX
TABLESPACE app1_idx01
);
Table altered.
SQL> ALTER TABLE emp ADD (
CONSTRAINT cons_fk_emp_dep
FOREIGN KEY ( dep_pk )
REFERENCES dep ( dep_pk )
);
Table altered.
|
Nu ska vi kolla vilka tabellutrymmen som dessa restriktioner (constraints) har skapat sina index i:
SQL> SELECT constraint_name, index_name FROM user_constraints;
CONSTRAINT_NAME INDEX_NAME
-------------------- ------------------------------
SYS_C005313
SYS_C005312
SYS_C005311
CONS_FK_EMP_DEP
CONS_PK_DEP CONS_PK_DEP
CONS_PK_EMP CONS_PK_EMP
SQL> SELECT index_name, tablespace_name FROM user_indexes;
INDEX_NAME TABLESPACE_NAME
------------------------------ ------------------------------
CONS_PK_DEP APP1_IDX01
CONS_PK_EMP APP1_IDX01
|
Det verkar också fungera. Nu vet vi att vi kan skapa objekt i båda dessa tabellutrymmen.
7. ALTER USER
Nedan visas syntaxen för ALTER USER:
ALTER USER username options;
ALTER USER username,... {GRANT|REVOKE} proxy_options;
options:
IDENTIFIED BY password [REPLACE old_password]
IDENTIFIED EXTERNALLY
IDENTIFIED GLOBALLY AS external_name
DEFAULT TABLESPACE tablespace
TEMPORARY TABLESPACE tablespace
QUOTA int {K | M} ON tablespace
QUOTA UNLIMITED ON tablespace
PROFILE profile_name
DEFAULT ROLE role [,role,...]
DEFAULT ROLE ALL [EXCEPT role,...]
DEFAULT ROLE NONE
PASSWORD EXPIRE
ACCOUNT {LOCK|UNLOCK}
proxy_options:
CONNECT THROUGH proxy [WITH ROLE role_name,...] [authentication]
CONNECT THROUGH proxy [WITH ROLE ALL EXCEPT role_name,...] [authentication]
CONNECT THROUGH proxy [WITH NO ROLES] [authentication]
authentication:
AUTHENTICATED USING PASSWORD
AUTHENTICATED USING DISTINGUISHED NAME
AUTHENTICATED USING CERTIFICATE [TYPE 'type'] [VERSION 'version']
|
8. SHOW USER
Vill man se vilken användare man är inloggad som skriver du:
[olle@dev1]$ SHOW USER
USER õr "SYS"
|