programmera.net -> oracledba -> normal     för utskrift      info@programmera.net

Användare i Oracle

1. CREATE USER
2. CREATE USER: Exempel 1
3. Inget "CREATE SESSION" privilegie
4. Inget "CREATE TABLE" privilegie
5. Inget "QUOTA"
6. CREATE USER: Exempel 2
7. ALTER USER
8. SHOW USER

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:

  1. 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.
  2. 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:
  1. Den första rollen "CONNECT" innehåller bara privilegiet "CREATE SESSION".
  2. 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"