Sekwencje/Liczniki

Transkrypt

Sekwencje/Liczniki
SQL w języku PL/SQL
Instrukcje SQL dzielimy na następujące kategorie:
1) Instrukcje
języka
manipulowania
danymi SELECT, INSERT, UPDATE, DELETE,
(DML)
2) Instrukcje języka definicji danych DDL
SET TRANSACTION, EXPLAIN PLAN
DROP, CREATE, ALTER, GRANT,
REVOKE
3) Instrukcje sterowania transakcją
COMMIT, ROLLBACK, SAVEPOINT, SET
TRANSACTION
4) Instrukcje sterowania sesji
ALTER SESION, SET ROLE
5) Instrukcje sterowania systemu
ALTER SYSTEM
Ad 1) Służą do zmieniania danych w tabelach lub danych zapytań w tabeli bazy danych, ale nie
umożliwiają zmiany struktury tabeli lub innych obiektów.
Ad 2) Służą do tworzenia, usuwania lub zmieniania struktury obiektu schematu oraz zmieniają
uprawnienia do obiektu.
Ad 3) Gwarantują zachowanie spójności danych dzięki zorganizowaniu instrukcji SQL w logiczne
transakcje kończące się powodzeniem lub niepowodzeniem.
Ad 4) Służą do zmieniania ustawień dla pojedynczego połączenia z bazą danych, np. do
aktywnego śledzenia sesji SQL.
Ad 5) Służą do zmieniania ustawień dla całej bazy danych, np. do aktywowania lub
dezaktywowania procesu archiwizacji.
1. WYKORZYSTANIE instrukcji SQL w PL/SQL
W języku PL/SQL dozwolone jest tylko użycie instrukcji DML z wyjątkiem EXPLAIN PLAN (1)
oraz instrukcji sterowania transakcjami (3). Niedozwolone są instrukcje DDL.
1
SQL w języku PL/SQL
Język programowania może wiązać zmienne na dwa sposoby:
a) przez wiązanie wczesne lub
b) wiązanie późne.
Wiązanie zmiennej jest procesem identyfikowania lokacji pamięci skojarzonej z identyfikatorem
programu. W języku PL/SQL wiązanie uwzględnia również sprawdzenie istnienia zezwolenia na
uzyskanie dostępu do odwoływanego obiektu schematu w bazie danych. W przypadku języka, w
którym stosuje się wiązanie wczesne, wiązanie zmiennej następuje podczas etapu kompilacji,
natomiast w przypadku języka, w którym stosuje się wiązanie późne, proces wiązania zmiennej jest
odkładany aż do czasu uruchomienia programu. Wiązanie wczesne, w przeciwieństwie do wiązania
późnego, wydłuża czas kompilacji, ale przyspiesza czas wykonania programu.
Język PL/SQL został celowo zaprojektowany w taki sposób, aby zastosować wiązanie wczesne.
Chodziło o jak najszybsze wykonanie bloku. Podczas kompilacji sprawdzane są wszystkie obiekty
bazy danych, co ważne jest bowiem bloki mogą być składowane za pomocą procedur, funkcji,
pakietów i wyzwalaczy. Obiekty te są składowane w skompilowanej formie, a zatem w razie
potrzeby mogą być bezpośrednio ładowane z bazy danych do pamięci i uruchamiane. Stąd nie
można stosować instrukcji DDL, które modyfikują obiekty bazy danych, bowiem wymagałoby to
ponownego sprawdzania zezwoleń, ponownego wiązania identyfikatorów, ponownej kompilacji.
Przykład. 1
BEGIN
CREATE TABLE A(
a number,
b char(1)
);
INSERT INTO A VALUES (10, 'a');
END;
/
W celu kompilacji tego bloku identyfikator A wymaga dowiązania, a to pociąga sprawdzenie czy
istnieje tabela. Ponieważ tabela utworzona zostanie dopiero w momencie uruchomienia bloku, blok
nie może zostać skompilowany.
2
SQL w języku PL/SQL
Stosowanie instrukcji SQL w języku PL/SQL jest możliwe dzięki technice dynamicznego SQL
(wbudowany dynamiczny SQL lub pakiet DBMS_SQL), czyli dynamicznego tworzenia instrukcji
SQL w czasie uruchamiania programu, analizowanie ich i uruchamianie. Instrukcje nie są tworzone
aż do czasu uruchomienia programu, a więc kompilator nie wiążąc identyfikatorów w tych
instrukcjach, pozwala na kompilację bloku.
Przykład. 2
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE A(
a number,
b char(1)
)';
EXECUTE IMMEDIATE 'INSERT INTO A VALUES (10, 'a')';
EXECUTE IMMEDIATE 'INSERT INTO A VALUES (20, 'b')';
EXECUTE IMMEDIATE 'INSERT INTO A VALUES (30, 'c')';
EXECUTE IMMEDIATE 'INSERT INTO A VALUES (40, 'd')';
EXECUTE IMMEDIATE 'INSERT INTO A VALUES (50, 'e')';
EXECUTE IMMEDIATE 'INSERT INTO A VALUES (60, 'f')';
END;
/
2. INSTRUKCJE DML w języku PL/SQL
Język PL/SQL umożliwia stosowanie w instrukcjach DML zmiennych, przy czym zmiennymi
można zastępować tylko wyrażenia.
3
SQL w języku PL/SQL
Przykład. 3
DECLARE
z A.a%TYPE;
BEGIN
z := 10;
UPDATE A
SET a = 20 * z
WHERE a = z;
END;
/
SELECT [*[, element listy wyboru]] INTO [zmienna[,zmienna]]
FROM odnośnik_do_tabeli
[WHERE warunek];
UWAGA: Instrukcja SELECT powinna zwracać najwyżej jeden wiersz.
Przykład. 4
DECLARE
z_a A.a%TYPE;
z_b A.b%TYPE;
z_rekord A%ROWTYPE;
BEGIN
SELECT * INTO z_rekord
FROM A
WHERE a = 20;
DBMS_OUTPUT.PUT_LINE(z_rekord.a || ' ' || z_rekord.b);
SELECT * INTO z_a, z_b
FROM A
WHERE a = 50;
DBMS_OUTPUT.PUT_LINE(z_a || ' ' || z_b);
END;
/
4
SQL w języku PL/SQL
Przykład. 5
CREATE TABLE B AS SELCT * FROM A WHERE a>20 AND a < 50;
DECLARE
z_rekord A%ROWTYPE;
BEGIN
SELECT * INTO z_rekord
FROM A WHERE a = 20;
INSERT INTO B VALUES(z_rekord.a, z_rekord.b);
INSERT INTO B SELECT * FROM A WHERE a = 50;
END;
/
Przykład. 6
DECLARE
z_b A.b%TYPE;
BEGIN
SELECT b INTO z_b
FROM A WHERE a = 60;
UPDATE B
SET b = z_b
WHERE a IN (SELECT a FROM A WHERE a >20 AND a<40);
END;
/
3. WIĄZANIA ZBIORCZE
Instrukcje SQL w blokach PL/SQL są wysyłane do mechanizmu SQL w celu ich wykonania. Z
kolei mechanizm SQL może przesłać dane z powrotem do mechanizmu PL/SQL, np.
5
SQL w języku PL/SQL
Przykład. 7
DECLARE
type tab_a is table of number index by binary integer;
zm_a tab_a;
type tab_b is table of char(1) index by binary integer;
zm_b tab_b;
BEGIN
FOR i IN 1..24 LOOP
zm_a(i) := i * 100;
zm_b(i) := CHR(ASCII('a')+i);
END LOOP;
FOR i IN 1..24 LOOP
INSERT INTO B VALUES(zm_a(i), zm_b(i));
END LOOP;
END;
/
Eliminacja przełączeń kontekstowych następuje poprzez użycie wiązania zbiorczego FORALL
Przykład. 8
DECLARE
type tab_a is table of number index by binary integer;
zm_a tab_a;
type tab_b is table of char(1) index by binary integer;
zm_b tab_b;
BEGIN
FOR i IN 1..24 LOOP
zm_a(i) := i * 100;
zm_b(i) := CHR(ASCII('a')+i);
END LOOP;
FORALL i IN 1..24
INSERT INTO B VALUES(zm_a(i), zm_b(i));
END;
/
6
SQL w języku PL/SQL
KLAUZULA RETURNING w poleceniach INSERT, UPDATE i DELETE.
Przykład. 9
DECLARE
aa char(1);
bb number;
BEGIN
INSERT INTO b VALUES(1000,'z') RETURNING a INTO bb;
DBMS_OUTPUT.PUT_LINE(bb);
UPDATE b SET a = 500 where a = 1000 RETURNING b INTO aa;
DBMS_OUTPUT.PUT_LINE(aa);
DELETE FROM b where a = 500 RETURNING a INTO bb;
DBMS_OUTPUT.PUT_LINE(bb);
END;
/
4. TWORZENIE SYNONIMÓW
CREATE SYNONYM nazwa synonimu FOR odwołanie;
DROP SYNONYM nazwa synonimu;
gdzie odwołanie to odwołane do tabeli innego użytkownika nazwa_uzytkownika.nazwa_tabeli.
CREATE SYNONYM ala FOR a;
SELECT * FROM ala;
5. PSEUDOKOLUMNY (LEVEL, ROWID, ROWNUM)
Licznik – jest obiektem, który automatycznie zwiększa swoją wartość po jego każdorazowym
odczycie. Liczniki są używane zwykle do generowania unikalnych identyfikatorów wierszy.
7
SQL w języku PL/SQL
Licznik definiujemy poleceniem:
create sequence [nazwa_użytkownika.] nazwa_licznika
[increment by liczba]
[start with wartość_początkowa]
[maxvalue wartość]
[cycle/nocycle];
nazwa_użytkownika jest opcjonalnym parametrem określającym użytkownika, który go utworzył.
increment by jest opcjonalnym parametrem określającym wartość o jaką będzie zwiększany licznik
po każdym odczycie.
start with jest opcjonalnym parametrem określającym początkową wartość licznika
cycle powrót do wartości początkowej po osiągnięciu maksymalnej wartości maxvalue. Domyślnie
licznik nie jest cykliczny.
nextval odczyt nowej wartości z licznika;
curval odczyt bieżącej wartości z licznika;
Przykład 1
create sequence licznik
increment by 1
start with 1
maxvalue 100
cycle;
Usunięcie licznika następuje po wydaniu polecenia
drop sequence nazwa_licznika;
AUTORYZACJA DOSTĘPU
Każdy system zarządzania bazą danych manipulujący dużą ilością informacji, często poufnych,
musi być wyposażony w mechanizmy uniemożliwiające dostęp do tych informacji przez
nieupoważnionych użytkowników lub aplikacje.
8
SQL w języku PL/SQL
Wyróżniamy cztery podstawowe sposoby ochrony danych:
1. sterowanie dostępem – przyznawanie prawa dostępu – polega na identyfikacji
poszczególnych użytkowników i na przyznawaniu im prawa dostępu do określonego zbioru
danych;
2. sterowanie przepływem danych – polega na kontrolowaniu przesłań danych w celu
zabezpieczenia ich przed osobami nieupoważnionymi;
3. ograniczanie możliwości wnioskowania – ma na celu uniemożliwienie użytkownikowi
bazy wyciągania wniosków dotyczących informacji, których nie powinien poznać, na
podstawie dostępnych danych;
4. szyfrowanie – umożliwia przechowywanie lub przesyłanie danych w postaci czytelnej
jedynie dla użytkowników znających odpowiedni kod.
Najpopularniejszy jest 1 sposób z wymienionych powyżej. Każdy SZBD rozróżnia swoich
użytkowników poprzez nadawanie im unikalnych identyfikatorów i zabezpieczanie dostępu do
systemu za pomocą hasła. Szczególnym użytkownikiem jest administrator systemu, który zwykle
posiada nieograniczone prawa dostępu do wszystkich obiektów bazy danych, możliwość
rejestrowania nowych użytkowników bazy danych oraz możliwość zmiany praw dostępu
określonych użytkowników do określonych obiektów. Użytkownicy nie będący administratorami
systemu są zwykle łączeni w grupy. Użytkownicy tej samej grupy na ogół mają te same prawa
dostępu do tych samych obiektów, chyba, że prawa te zostały indywidualnie zmodyfikowane w
odniesieniu do określonego podzbioru obiektów.
Rozróżniane są również obiekty bazy danych:
1. obiekty własne – obiekty utworzone przez danego użytkownika, do których posiada on zwykle
nieograniczone prawa dostępu. Obiekty te są adresowane przez podanie ich nazw;
2. obiekty obce adresowane są przez złożenie identyfikatora użytkownika, separatora i nazwy.
Wśród obiektów obcych wyróżnia się:
a) obiekty systemowe są zwykle niezbędne dla większości użytkowników, np. do dynamicznego
rozwoju schematu bazy danych. Są w większości widoczne, ale nie mogą być zwykle przez nich
modyfikowane;
9
SQL w języku PL/SQL
b) obiekty innych użytkowników – są zwykle niewidoczne, chyba, że użytkownik w sposób jawny
wskazał użytkowników, którym przysługują szczególne prawa dostępu.
Drugą płaszczyzną podziału obiektów jest uwzględnienie ich typów, takich jak: relacja,
perspektywa, indeks, synonim, itd. Z każdym z typów obiektów mogą być domyślnie wiązane w
ogólności różne prawa dostępu dla różnych użytkowników.
W przypadku relacji (zwykle również i perspektywy) prawo dostępu do niej może obejmować
następujące przywileje:
● odczytu (ang. read),
● wstawiania nowych wierszy (ang. insert),
● usuwania wierszy (ang. delete),
● modyfikowania wartości jednego lub wielu kolumn wiersza (ang. update),
● dołączania nowych kolumn, tj. modyfikowania schematu relacji (perspektywy) (ang. expand),
● usuwania całej relacji (ang. drop),
● tworzenia indeksów dla relacji (ang. index).
Szczególnym prawem, niezbędnym do manipulowania obiektami bazy danych, jest prawo
dołączania się do bazy danych nadawane przez administratora systemu (do niego również należy
określenie typu użytkownika i ewentualnie grup, do których należy).
Użytkownik, posiadający prawo przekazywania przyznanych przywilejów innym użytkownikom
bazy danych, może określać prawa dostępu innych użytkowników do obiektów obcych. Na ogół
zbiór przywilejów przekazywanych przechodnio innym użytkownikom jest podzbiorem
przywilejów użytkownika, który je przekazuje.
Przywileje mogą być nadawane i odbierane w sposób dynamiczny w dowolnej chwili pracy SZBD.
W poleceniu przydzielania przywilejów określa się:
● typ przywileju,
● obiekt,
● użytkownika (grupę użytkowników), któremu przywilej się nadaje.
Podstawowymi poleceniami sterownia dostępem do danych są: grant i revoke.
10
SQL w języku PL/SQL
grant – nadawanie użytkownikom systemu odpowiednich przywilejów.
Składnia:
grant przywileje
on obiekt
to użytkownik;
gdzie przywileje dla relacji (perspektywy) to:
● select odczyt danych,
● insert wstawianie wierszy,
● update uaktualnianie wierszy,
● delete usuwanie wierszy,
● alter zmiana schematu,
● index tworzenie indeksów,
● all powyższe, wszystkie.
Dostęp do cudzej relacji (tzn. utworzonej przez innego użytkownika) wymaga uzyskania
odpowiedniego przywileju, poprzedzenia nazwy relacji (zespol) identyfikatorem jej właściciela
(ktos), np. ktos.zespol
Aby udostępnić określony obiekt wszystkim użytkownikom SZBD – stosujemy tzw. przywilej
ogólny. W tym celu w poleceniu grant, zamiast identyfikatora użytkownika, wpisujemy słowo
kluczowe public.
Aby użytkownik mógł przekazać otrzymane przywileje innym użytkownikom musimy w poleceniu
grant użyć klauzuli with grant option.
grant select
on etat
to PRZEMYSLAW;
grant all
on zespol
to ADAM
with grant option;
11
SQL w języku PL/SQL
grant select
on pracownik
to public;
Administrator SZBD jest jedynym użytkownikiem, który może rejestrować nowych użytkowników
w systemie. W tym celu posługuje się poleceniem grant o następującym formacie:
grant przywilej to użytkownik identified by haslo;
gdzie przywilej jest albo connect – możliwość dołączenia się do SZBD Oracle, albo resource –
możliwość tworzenia obiektów bazy danych, np. relacji, liczników, albo dba – możliwość
definiowania użytkowników oraz pełnego dostępu do obiektów i funkcji SZBD.
W celu odwołania (usunięcia) wcześniej nadanego przywileju stosujemy polecenie revoke o
następującej składni:
revoke przywileje
on relacja/perspektywa
from użytkownicy;
12