Skrypty z rozdziau 10 ksiki ORACLE9i, podrcznik administratora.  Wicej informacji w pliku readme.doc.



grant select on EMPLOYEE to PUBLIC;


create user THUMPER
identified by R3BB#T
default tablespace USERS
temporary tablespace TEMP;


alter user THUMPER
quota 100M on USERS;


drop user THUMPER cascade;


create role ACCOUNT_CREATOR;
grant CREATE SESSION, CREATE USER, ALTER USER 
   to ACCOUNT_CREATOR;


alter user THUMPER default role NONE;

alter user THUMPER default role CONNECT;

alter user THUMPER default role all except ACCOUNT_CREATOR;


alter profile DEFAULT
limit idle_time 60;


create profile LIMITED_PROFILE limit
FAILED_LOGIN_ATTEMPTS 5;

create user JANE identified by EYRE
profile LIMITED_PROFILE;

grant CREATE SESSION to JANE;


alter user JANE account unlock;


alter user JANE account lock;


alter profile LIMITED_PROFILE limit
PASSWORD_LIFE_TIME 30;


alter user jane password expire;


alter profile LIMITED_PROFILE limit
PASSWORD_REUSE_MAX 3
PASSWORD_REUSE_TIME UNLIMITED;


alter user JANE identified by austen;

alter user JANE identified by eyre;


alter user jane identified by austen;


Rem utlpwdmg.sql
Rem
Rem  Copyright (c) Oracle Corporation 1996. Wszelkie prawa 
Rem  zastrzeone.
Rem
Rem    NAZWA
Rem      utlpwdmg.sql - skrypt dla limitw zasobw domylnego hasa
Rem
Rem    OPIS
Rem      To jest skrypt do uaktywnienia opcji zarzdzania hasem   
Rem      przez ustawienie limitw zasobw domylnego hasa.
Rem
Rem    UWAGI
Rem      Ten plik zawiera funkcj minimalnego sprawdzania zoonoci 
Rem      hasa. To jest raczej prbna funkcja, ktr uytkownik moe 
Rem      uy, aby opracowa funkcj dla rzeczywistych sprawdze
Rem      zoonoci, ktre uytkownik chciaby wykona dla nowego
Rem      hasa.
Rem
Rem    asurpur     12/12/96  Zmiana nazwy funkcji_weryfikacji_hasa
Rem    password_verify_function
-- Ten skrypt ustawia parametry zasobw domylnego hasa. 
-- Aby uaktywni wasnoci hasa naley ten skrypt uruchomi. 
-- Domylne parametry zasobw mog by zmienione wedug potrzeb. 
-- Dostarczona jest rwnie funkcja sprawdzenia zoonoci domylnego 
-- hasa. Ta funkcja wykonuje minimalne sprawdzenia zoonoci, takie 
-- jak minimaln dugo hasa, czy haso nie jest takie samo jak
-- nazwa uytkownika itd. Uytkownik moe t funkcj wzbogaci wedug   
-- swoich potrzeb. Ta funkcja musi by utworzona w schemacie SYS. 
-- Przed uruchomieniem tego skryptu naley wykona poczenie 
-- sys/<haso> jako sysdba. 

CREATE OR REPLACE FUNCTION verify_function
(username varchar2,
  password varchar2,
  old_password varchar2)
  RETURN boolean IS 
   n boolean;
   m integer;
   differ integer;
   isdigit boolean;
   ischar  boolean;
   ispunct boolean;
   digitarray varchar2(20);
   punctarray varchar2(25);
   chararray varchar2(52);

BEGIN 
   digitarray:= '0123456789';
   chararray:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
   punctarray:='!"#$%&()''*+,-/:;<=>?_';

   -- Sprawd, czy haso jest takie samo jak nazwa uytkownika
   IF password = username THEN
     raise_application_error(-20001, 'Haso takie samo jak nazwa         
                             uytkownika');
   END IF;

   -- Sprawd wystpowanie minimalnej dugoci hasa
   IF length(password) < 4 THEN<
      raise_application_error(-20002,'Dugo hasa mniejsza ni  4');
   END IF;

   -- Sprawd, czy haso nie jest za proste. Mona poda sownik 
   -- wyrazw za pomoc ktrego modu sprawdzajcy nie pozwoli na 
   -- zastosowanie sw, ktre s zbyt proste na haso. 
IF password IN ('witam','haso','oracle','komputer',abcd') THEN
      raise_application_error(-20002, 'Haso za proste');
   END IF;

   -- Sprawd, czy haso zawiera przynajmniej jedn liter, jedn 
   -- cyfr i jeden znak interpunkcyjny.
   -- 1. Sprawd wystpowanie cyfry
   isdigit:=FALSE;
   m := length(password);
   FOR i IN 1..10 LOOP 
      FOR j IN 1..m LOOP 
         IF substr(password,j,1) = substr(digitarray,i,1) THEN
            isdigit:=TRUE;
             GOTO findchar;
         END IF;
      END LOOP;
   END LOOP;
   IF isdigit = FALSE THEN
      raise_application_error(-20003, 'Haso powinno zawiera przynajmniej jedn liter, jedn cyfr i jeden znak interpunkcyjny');
   END IF;
   -- 2. Sprawd wystpowanie litery
   <<findchar>>
   ischar:=FALSE;
   FOR i IN 1..length(chararray) LOOP
      FOR j IN 1..m LOOP
         IF substr(password,j,1) = substr(chararray,i,1) THEN
            ischar:=TRUE;
             GOTO findpunct;
         END IF;
      END LOOP;
   END LOOP;
   IF ischar = FALSE THEN
      raise_application_error(-20003, 'Haso powinno zawiera przynajmniej jedn liter, jedn cyfr i jeden znak interpunkcyjny');
   END IF;
   -- 3. Sprawd wystpowanie znaku interpunkcyjnego
   <<findpunct>>
   ispunct:=FALSE;
   FOR i IN 1..length(punctarray) LOOP
      FOR j IN 1..m LOOP
         IF substr(password,j,1) = substr(punctarray,i,1) THEN
            ispunct:=TRUE;
             GOTO endsearch;
         END IF;
      END LOOP;
   END LOOP;
   IF ispunct = FALSE THEN
      raise_application_error(-20003, 'Haso powinno zawiera przynajmniej jedn liter, jedn cyfr i jeden znak interpunkcyjny');
   END IF;

   <<endsearch>>
   -- Sprawd, czy haso rni si od poprzedniego hasa przynajmniej   
   -- 3 literami 
   IF old_password = '' THEN
      raise_application_error(-20004, 'Stare haso ma warto   
                              zerow');
   END IF;
   -- Wszystko jest w porzdku; return TRUE ;
   RETURN(TRUE);
   differ := length(old_password) - length(password);

   IF abs(differ) < 3 THEN
      IF length(password) < length(old_password) THEN
         m := length(password);
      ELSE
         m := length(old_password);
      END IF;
      differ := abs(differ);
      FOR i IN 1..m LOOP
          IF substr(password,i,1) != substr(old_password,i,1) THEN
             differ := differ + 1;
          END IF;
      END LOOP;
      IF differ < 3 THEN
          raise_application_error(-20004, 'Haso powinno rni si 
                                  przynajmniej 3 znakami');
      END IF;
   END IF;
   -- Wszystko jest w porzdku; return TRUE ;
   RETURN(TRUE);
END;
/

-- Ten skrypt zmienia parametry domylne dla opcji zarzdzania hasami
-- Password Management. To znaczy, e wszyscy uytkownicy w systemie 
-- bd mieli uaktywnion opcj zarzdzania hasami Password 
-- Management i bd mieli ustawione podane poniej wartoci, dopki 
-- dla uytkownika nie zostanie utworzony i przydzielony 
-- inny profil z parametrami o wartociach innych lub UNLIMITED. 

ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME 60
PASSWORD_GRACE_TIME 10
PASSWORD_REUSE_TIME 1800
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_LOCK_TIME 1/1440
PASSWORD_VERIFY_FUNCTION verify_function;




alter profile DEFAULT limit
PASSWORD_VERIFY_FUNCTION VERIFY_FUNCTION;


create user OPS$FARMER
identified by SOME_PASSWORD
default tablespace USERS
temporary tablespace TEMP;


create user OPS$FARMER
identified externally
default tablespace USERS
temporary tablespace TEMP;


connect george/mch11@PROD.world AS SYSDBA


revoke SYSDBA from George;

create user THUMPER
identified by R3BB#T;

alter user THUMPER identified by NEWPASSWORD;

password

password JANE

alter user USERNAME identified by NEWPASSWORD;

create role ACCOUNT_CREATOR identified by HELPD2SK_ONLY;
alter role ACCOUNT_CREATOR not identified;
alter role MANAGER identified externally;


grant select, update (Employee_Name, Address)
on EMPLOYEE to MCGREGOR
with grant option;

connect MCGREGOR/FARMER
grant select on THUMPER.EMPLOYEE to JFISHER;



create role APPLICATION_USER;
grant CREATE SESSION to APPLICATION_USER;

create role DATA_ENTRY_CLERK;
connect THUMPER/R3BB#T
grant select, insert on THUMPER.EMPLOYEE to DATA_ENTRY_CLERK;
grant select, insert on THUMPER.TIME_CARDS to DATA_ENTRY_CLERK;
grant select, insert on THUMPER.DEPARTMENT to DATA_ENTRY_CLERK;



grant APPLICATION_USER to DATA_ENTRY_CLERK;


grant DATA_ENTRY_CLERK to MCGREGOR;


grant DATA_ENTRY_CLERK to BPOTTER with admin option;


set role DATA_ENTRY_CLERK;

set role NONE;


revoke delete on EMPLOYEE from PETER;
revoke all on EMPLOYEE from MCGREGOR;

revoke ACCOUNT_CREATOR from HELPDESK;

drop user USERNAME cascade;

grant SELECT on EMPLOYEE to MCGREGOR with grant option;

grant SELECT on THUMPER.EMPLOYEE to BPOTTER with grant option;

revoke SELECT on EMPLOYEE from MCGREGOR;


select
      Role,             /*Nazwa roli*/
      Privilege,        /*Uprawnienie systemowe*/
      Admin_Option      /*Czy zostaa przyznana opcja admin?*/
 from ROLE_SYS_PRIVS;


select
      Grantee,           /*Odbiorca przyznania*/
      Owner,             /*Waciciel obiektu*/
      Table_Name,        /*Nazwa obiektu*/
      Grantor,           /*Uytkownik, ktry dokona przyznania*/
      Privilege,         /*Przyznane uprawnienie*/
      Grantable          /*Czy zostaa przyznana opcja admin?*/
 from DBA_TAB_PRIVS;


select
      DBA_ROLE_PRIVS.Grantee,        /*Odbiorca przyznania*/
      ROLE_TAB_PRIVS.Owner,          /*Waciciel obiektu*/
      ROLE_TAB_PRIVS.Table_Name,     /*Nazwa obiektu*/
      ROLE_TAB_PRIVS.Privilege,      /*Przyznane uprawnienie*/
      ROLE_TAB_PRIVS.Grantable       /*Czy zostaa przyznana opcja admin?*/
 from DBA_ROLE_PRIVS, ROLE_TAB_PRIVS
where DBA_ROLE_PRIVS.Granted_Role = ROLE_TAB_PRIVS.Role
  and DBA_ROLE_PRIVS.Grantee = 'nazwa uytkownika';



select
      Username,         /*Nazwa uytkownika*/
      Password          /*Zaszyfrowane haso*/
from DBA_USERS
where Username in ('MCGREGOR','THUMPER','OPS$FARMER');



create user MCGREGOR identified by VALUES '1A2DD3CCEE354DFA';



alter user OPS$FARMER identified by VALUES 'no way';

select
      Username,         /*Nazwa uytkownika*/
      Password          /*Zaszyfrowane haso*/
from DBA_USERS
where Username in ('MCGREGOR','THUMPER','OPS$FARMER');


REM*  become_another_user.sql
REM*	
REM*  Ten skrypt generuje  polecenia konieczne w celu
REM*  tymczasowego przejcia konta innego uytkownika.
REM*
REM*  Skrypt musi by uruchomiony z konta DBA.
REM*
REM*  Zmienna wejciowa: nazwa uytkownika przejmowanego konta. 
REM*
REM*  Etapy 1, 2, oraz 3: wykonaj zapytanie na perspektywie DBA_USERS. 
REM*  Wygeneruj polecenie ALTER USER, ktre bdzie konieczne do
REM*  ponownego ustawienia hasa na jego biec warto. 
REM*
set pagesize 0 feedback off verify off echo off termout off
REM*
REM*  Utwrz plik o nazwie reset.sql do to przechowania wygenerowanych 
REM*  polece.
REM*
spool reset.sql
REM*
REM*  Wybierz zaszyfrowane haso z perspektywy DBA_USERS.
REM*
SELECT 'alter user &&1 identified by values '||''''||
password||''''||' profile '||profile||';'
FROM dba_users WHERE username = upper('&&1');

prompt 'host rm -f reset.sql'
prompt 'exit'
spool off
exit



alter user MCGREGOR identified by MY_TURN;
connect MCGREGOR/MY_TURN


sqlplus system/manager @reset


create profile temp_profile limit
password_verify_function   null
password_reuse_time        unlimited
password_reuse_max         unlimited; 


select * from PATIENTS;

select * 
  from PATIENTS
 where PATIENT_ID = sys_context('PATIENT_CONTEXT','ALL_PATIENT_ID')
/


create table PATIENT_PERSONAL_INFORMATION
(Patient_Id          NUMBER(10) primary key,
 Physician_Id        NUMBER(6) not null,
 Patient_Username  VARCHAR2(10),
 Patient_Name      VARCHAR2(20),
 Patient_Address1  VARCHAR2(20),
 Patient_Address2  VARCHAR2(20),
 Patient_Phone     NUMBER(10)
);
create table MEDICAL_INFORMATION
(Patient_id          NUMBER(10) primary key,
 Test_Performed      VARCHAR2(30),
 Test_Results        VARCHAR2(50),
 Diagnosis           VARCHAR2(500)
);



create context MEDICAL_SEC_CTX using MEDICAL_DEPT.MEDICAL_SEC;

create or replace package MEDICAL_SEC is
   procedure GET_PATIENT_ID;
end MEDICAL_SEC;
/ 
create or replace package body MEDICAL_SEC is 
   procedure GET_PATIENT_ID
   is
   PATIENT_ID_VAR number;
   begin
    select PATIENT_ID
      into PATIENT_ID_VAR from PATIENT_PERSONAL_INFORMATION 
     where PATIENT_USERNAME = SYS_CONTEXT('USERENV','SESSION_USER');
    dbms_session.set_context('MEDICAL_SEC_CTX', 'PATIENT_ID', PATIENT_ID_VAR);
   end GET_PATIENT_ID;
end MEDICAL_SEC;
/



create or replace package MEDICAL_SEC as
 function MEDICAL_ID_SEC return varchar2;
 END MEDICAL_SEC;
/
create or replace package body MEDICAL_SEC as
/* OGRANICZA INSTRUKCJE SELECT BAZUJC NA WARTOCI PATIENT_ID */
 function MEDICAL_ID_SEC return varchar2
 is
   MY_PREDICATE varchar2 (2000);
   begin
     MY_PREDICATE := 'PATIENT_ID=SYS_CONTEXT(''MEDICAL_SEC_CTX'',''PATIENT_ID'')';
     return MY_PREDICATE;
    end MEDICAL_ID_SEC;
end MEDICAL_SEC;
/


execute DBMS_RLS.ADD_POLICY ('MEDICAL_DEPT','MEDICAL_INFORMATION','MEDICAL_POLICY','MEDICAL_DEPT','MEDICAL_SEC.MEDICAL_ID_SEC','SELECT',FALSE,TRUE);


execute DBMS_RLS.REFRESH_POLICY
('<schemat w ktrym przechowywana jest polityka>', '<nazwa_tabeli>', '<nazwa_polityki>';


audit session;

audit session whenever successful;
audit session whenever not successful;


select
  OS_Username,       /*Nazwa uytkownika systemu operacyjnego.*/
  Username,          /*Nazwa uytkownika konta bazy danych Oracle.*/
  Terminal,                              /*Identyfikator uytego terminala.*/
  DECODE(Returncode,'0','Connected',
             '1005','FailedNull',
             '1017','Failed',Returncode),/*Sprawdzenie niepowodzenia*/
  TO_CHAR(Timestamp,'DD-MON-YY HH24:MI:SS'),    /*Czas zalogowania*/
  TO_CHAR(Logoff_Time,'DD-MON-YY HH24:MI:SS')   /*Czas wylogowania */
from DBA_AUDIT_SESSION;



audit role;
noaudit role;

select
      Action,       /*Kod dziaania.*/
      Name          /*Nazwa dziaania taka jak ALTER USER.*/
from AUDIT_ACTIONS;


select
  OS_Username,           /*Nazwa uytkownika systemu operacyjnego.*/
  Username,              /*Nazwa konta uytkownika bazy danych Oracle.*/
  Terminal,              /*Identyfikator wykorzystanego terminala.*/      
  Owner,                 /*Waciciel obiektu oddziaywania.*/
  Obj_Name,              /*Nazwa obiektu oddziaywania.*/
  Action_Name,           /*Kod liczbowy dziaania.*/
  DECODE(Returncode,'0','Success',Returncode),/*Sprawdzenie      
                                               niepowodzenia*/
  TO_CHAR(Timestamp,'DD-MON-YY HH24:MI:SS')   /*Znacznik czasu*/
from DBA_AUDIT_OBJECT;



audit update table by MCGREGOR;


audit insert on THUMPER.EMPLOYEE;
audit all on THUMPER.TIME_CARDS;
audit delete on THUMPER.DEPARTMENT by session;


/* dodaj polityk */
exec DBMS_FGA.ADD_POLICY(
object_schema => 'FM',
object_name   => 'PRODUCE',
policy_name   => 'CHK_CARROT_COUNT',
audit_condition => 'VEGETABLE = ''CARROTS'' ', 
audit_column => 'QUANTITY',
handler_schema => 'SEC',
handler_module => 'LOG_ACTION',
enable               =>  TRUE);

audit all on SYS.AUD$ by access;





