SQL-DDL - zti.polsl.pl
Transkrypt
SQL-DDL - zti.polsl.pl
SQL - DDL
DDL (ang. data definition language) jest częścią języka zapytań SQL obejmująca
tworzenie i zarządzanie (modyfikację, usuwanie i przydzielanie uprawnień) obiektami w bazie
danych (tabelami, perspektywami, indeksami). Podstawowe instrukcje tej części języka są
wspólne dla wielu implementacji, jednak poszczególne opcje, typy danych oraz zarządzanie
prawami użytkowników różnią się w znacznym stopniu w zależności od implementacji serwera
baz danych. Niniejsze opracowanie opisuje język SQL-DDL na serwerze baz danych MySQL.
1 Tabele systemowe
Informacje o wszystkich obiektach SQL-owej bazy danych przechowywane są w tabelach
systemowych zorganizowanych w tzw. słownik danych (ang. data dictionary) lub inaczej katalog
systemowy. Użytkownik z odpowiednimi uprawnieniami może wykonywać następujące operacje
na tabelach systemowych:
selekcja danych,
tworzenie własnych perspektyw opartych o tabele systemowe,
tworzenie synonimów tabel systemowych,
tworzenie indeksów na kolumnach tabel systemowych,
dodawanie kolumn użytkownika,
usuwanie kolumn użytkownika,
modyfikacja danych w kolumnach użytkownika.
Nie można natomiast usuwać tabel systemowych, usuwać z nich podstawowych kolumn
oraz dodawać własnych wierszy. Kolumny dodawane przez użytkownika nie są oczywiście
utrzymywane przez serwer. Użytkownik (prócz administratora) posiada powyższe prawa o ile
zostaną mu one nadane. Domyślnie każdy użytkownik bazy danych może przeglądać dane w
tabelach systemowych. Można również tworzyć dla użytkowników perspektywy oparte o tabele
systemowe, w których do selekcji danych można używać słowa kluczowego USER, oznaczającego
nazwę bieżącego użytkownika.
2 Typy danych
2.1
Liczby całkowite (INTEGER):
INT, INTEGER - w takich kolumnach przechowujemy liczby całkowite z zakresu: 2147483648
do 2147483647 (4 bajty)
TINYINT - liczba całkowita z zakresu:-128 do 127 (1 bajt)
SMALLINT - liczba całkowita z zakresu:-32768 do 32767 (2 bajty)
MEDIUMINT - liczba całkowita z zakresu:-8388608 do 8388607 (3 bajty)
BIGINT - liczba całkowita z zakresu: 9223372036854775808 do 9223372036854775807
(8 bajtów)
2.2
Liczby rzeczywiste (REAL):
FLOAT [(M, D)] - liczba rzeczywista z zakresu: 3.402823466E+38 do - 1.175494351E-38 oraz
0 i 1.175494351E-38 do 3.402823466E+38 (4 bajty),
DOUBLE [(M, D)] - liczba rzeczywista z zakresu: 1.7976931348623157E+308 do
2.2250738585072014E-308 i 0 i 2.2250738585072014E-308 do 1.7976931348623157E+308 (8
bajtów)
DECIMAL [(M[, D])] – ustalona liczba, gdzie M jest ilością znaczących pozycji w liczbie, a D
ilość pozycji po separatorze dziesiętnym (domyślnie kropka), np.: DECIMAL(5,2) będzie miał
zakres od -999.99 do 999.99.
2.3
Czasowe typy danych w MySQL'u
DATETIME - data wraz z godziną w formacie: YYYY:MM:DD:HH:mm:SS (odpowiednio rok,
miesiac, dzien, godzina, minuta i sekunda), typ ten akceptuje zakres od '1000-01-01 00:00:00'
do '9999-12-31 23:59:59'
DATE - data w formacie YYYY:MM:DD (rok, miesiac, dzien), zakres od '1000-01-01' do
'9999-12-31'
TIME - godzina w formacie HH:mm:SS (godzina, minuta, sekunda)
YEAR - rok YYYY (np.:2001) zakres od 1901 do 2155 (1 bajt)
TIMESTAMP(n) - data z godzina, precyzje ustalana przez użytkownika poprzez wartość n (dla
przykładu n=14 oznacza datę i godzinę w formacie YYYY:MM:DD:HH:mm:SS a n=2 YY)
zakres od 1970 do 2037
2.4
Łańcuchowe (znakowe) typy danych
CHAR[n] - łańcuch znaków o ustalonej długości n, gdzie n może przyjmować wartości 0 - 255,
domyślnie n = 1.
VARCHAR(n) - łańcuch znaków o zmiennej długości, maksymalnie n, gdzie n może
przyjmować wartości 0 - 65 535.
BLOB - "pamięta" dane w formie binarnej, ze względu na maksymalna długość takiego ciągu
znaków dzieli sie na kilka podtypów: TINYBLOB (2^8 znaków), BLOB (2^16 znaków),
MEDIUMBLOB (2^24 znaków), LONGBLOB (2^32 znaków).
TEXT - dane tekstowe, podobnie jak BLOB ma odmiany ze względu na długość tekstu:
TINYTEXT (2^8 - 256 znaków ), TEXT (2^16 - 65535 znaków), MEDIUMTEXT (2^24 16777216 znaków), LONGTEXT (2^32 – 4294967296 znaków).
2.5
Typ wyliczeniowy ENUM
Dane przyjmują wartości spośród wcześniej przygotowanej przez nas listy. Lista taka może
mieć maksymalnie 65535 elementów.
2.6
Typ zbiorowy SET
Pozycja taka może przyjmować 0 lub więcej wartości spośród listy przygotowanej podczas
tworzenia tabeli. Przykład : dla definicji SET ("jeden" , "dwa") do komórki tabeli możemy zapisać
następujące wartości: "" lub "jeden" lub "dwa" lub "jeden, dwa". Definicja SET może mieć
maksymalnie 64 elementy.
3 Zarządzanie strukturą tabel
3.1
Tworzenie tabel
Do tworzenia tabel służy polecenie: CREATE [TEMPORARY] TABLE [IF NOT
EXISTS] tbl_name (create_definition,...) [table_option] [partition_options].
W najprostszej postaci tego polecenia specyfikujemy tylko nazwę tabeli (table name) oraz
listę nazw kolumn (column name) wraz z typami i rozmiarami (data type), np.:
CREATE TABLE pracownicy (
imie VARCHAR(30),
nazwisko VARCHAR(30),
data_urodzenia DATE,
placa DECIMAL(10,2)
);
Po każdej nazwie pola następuje definicja typu danych, jakie będzie ono zawierało:
data_type [NOT NULL | NULL] [DEFAULT default_value]. Atrybut kolumny NOT NULL
oznacza, że zadaniem serwera jest niedopuszczenie do sytuacji, aby w jakimkolwiek wierszu tabeli
kolumna ta miała wartość pustą. Istnieje możliwość określenia wartości domyślnej, jakie przyjmie
każde nowe pole w momencie, kiedy nie zostanie wypełnione innymi danymi. Wartości domyślne
podaje się dla każdego pola po słowie kluczowym DEFAULT zaraz po definicji typu, np.:
CREATE TABLE pracownicy (
imie VARCHAR(30),
nazwisko VARCHAR(30) NOT NULL,
data_urodzenia DATE NOT NULL DEFAULT '1950-01-01',
placa DECIMAL(10,2) DEFAULT '1000.00'
);
3.2
Więzy integralności referencyjnej
Na etapie definiowania struktury tabeli można określić jej powiązania z innymi tabelami za
pomocą mechanizmu kluczy głównych (pierwotnych, ang. primary key) i obcych (ang. foreign
key).
Mechanizm ten polega na tym, że w tabeli podrzędnej (w której definiujemy klucz
obcy) kolumny wchodzące w skład klucza obcego mogą zawierać wyłącznie wartości występujące
w tabeli nadrzędnej w odpowiadających im kolumnach tworzących tam klucz główny.
Klucz główny:
wartość, jaką przyjmują kolumny klucza głównego musi być unikalna,
tabela może posiadać tylko jeden klucz główny,
klucz główny może być oparty o jedną lub więcej kolumn,
każda kolumna wchodząca w skład klucza głównego musi posiadać atrybut NOT NULL.
Klucz obcy:
klucz obcy musi odnosić się do zdefiniowanego wcześniej klucza głównego w tabeli
nadrzędnej,
klucz obcy może składać się z jednej lub więcej kolumn - musi być oparty o dokładnie taka
sama listę kolumn (liczba, typy, kolejność) jak klucz główny w tabeli nadrzędnej,
kolumny wchodzące w skład klucza obcego mogą, ale nie musza posiadać atrybutu NOT
NULL,
w tabeli może być zdefiniowanych kilka kluczy obcych.
Kontrola zgodności danych występujących w tabeli nadrzędnej i podrzędnej realizowana jest
w czasie wykonywania wszystkich operacji na danych, chyba, że jest to w bazie danych. Serwer nie
dopuszcza do wprowadzenia danych do tabeli podrzędnej, dla których nie istnieją odpowiednie dane
(o wartościach równych którejś z wartości klucza głównego) w tabeli nadrzędnej.
Jeśli dla wiersza tabeli nadrzędnej istnieją wiersze potomne (o odpowiednich
wartościach w kolumnach klucza obcego) w tabeli podrzędnej, modyfikację lub usunięcie danych z
tabeli nadrzędnej, które posiadają wiersze potomne można uzależnić za pomocą opcjonalnej frazy:
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]
reference_option:
RESTRICT (opcja domyślna) oznacza brak możliwości usunięcia takich danych,
CASCADE - powoduje, że usunięcie danych z tabeli nadrzędnej pociąga za sobą automatyczne
usunięcie wierszy potomnych z tabeli podrzędnej,
SET NULL - jest zezwoleniem na usuwanie danych z tabeli nadrzędnej, a wiersze tabeli
podrzędnej, które w wyniku tej operacji zostały "osierocone" zostaną automatycznie
zmodyfikowane: będą posiadać wartości NULL w kolumnach klucza głównego.
NO ACTION.
Przykłady:
create table zespoły
( nrz smallint not null primary key,
nazwa_z char(40) not null)
create index zesp_nr on zespoły (nrz)
create table pracowni
( nrp int not null,
nazw char (25) not null,
data_ur date not null,
nrz smallint foreign key fk_zesp (nrz) references
zespoly (nrz)on delete set null)
3.3
Modyfikacja struktury tabeli
ALTER TABLE tbl_name alter_specification [, alter_specification] …
Za pomocą tego polecenia można dodać, usunąć, zmodyfikować kolumny lub zmienić
nazwy kolumn, czy całej tabeli:
ADD - dodaje kolumny do tabeli. Kolumny są definiowane w ten sam sposób jak przy
tworzeniu tabeli.
DROP - usuwa kolumny z tabeli. Jeśli kolumna nie była pusta, dane zostają utracone. Nie
można usunąć kolumn, na których zbudowane są indeksy, a także kolumn wchodzących w skład
klucza głównego lub obcego.
MODIFY - zmienia atrybuty kolumny. Można zwiększyć rozmiary kolumny znakowej. Nie
można jej rozmiaru zmniejszyć. Nie można zmieniać typu danych w kolumnie. Nie można
zmieniać rozmiaru kolumn numerycznych. Opcje NOT NULL i NOT NULL DEFAULT mają
takie samo znaczenie, jak przy tworzeniu tabeli. Opcja NULL powoduje wyłączenie atrybutów
NOT NULL.
RENAME - umożliwia zmianę nazwy kolumny, bądź całej tabeli.
Przykłady:
alter table pracowni add imie char(l5)
alter table pracowni modify imie char(20) not null
alter table pracowni rename table 'wszyscy pracownicy'
3.4 Modyfikacja więzów integralności w tabeli
Ta sama instrukcja (ALTER TABLE) służy do dodania lub usunięcia kluczy głównych i
obcych w tabelach:
… ADD PRIMARY KEY (index_col_name,...)
… ADD FOREIGN KEY (index_col_name,...) reference_definition
lub
… DROP PRIMARY KEY
… DROP FOREIGN KEY fk_symbol
Przy zakładaniu więzów należy przestrzegać reguł opisanych przy omawianiu
instrukcji tworzenia tabeli.
3.5 Indeksowanie tabeli
CREATE [ONLINE|OFFLINE] [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[index_type] ON tbl_name (index_col_name,...)
index_type:
USING {BTREE | HASH}
Powyższa instrukcja umożliwia stworzenie indeksu na tabeli:
unikalnego (gdy użyjemy frazy UNIQUE) - wymuszającego w serwerze unikalność
przechowywanych danych,
nieunikalnego (bez frazy UNIQUE) - potencjalnie przyspieszającego wyszukiwanie danych.
Serwer wspiera struktury indeksów:
B-drzewa - domyślna struktura indeksów, które można zakładać na pustej lub wypełnionej już
tabeli, liczba tych indeksów nie jest ograniczona formalnie. Tylko dla tych indeksów ma
znaczenie opcja ASC (domyślna) lub DESC oznaczające kolejność sortowania.
tablice mieszające (HASH) - są to indeksy umożliwiające szybszy dostęp do danych niż w
przypadku B-drzewa w przypadku gdy jest to indeks unikalny lub dane powtarzają się
stosunkowo rzadko (jest mało kolizji w tablicy mieszającej). Ten rodzaj indeksów
przeznaczony jest dla tabel statycznych (np. słownikowych), których rozmiar jesteśmy w
stanie przewidzieć.
Przykłady:
create index doch_nrpnrt on pracowni(nrp, nrt)
create unique index zesp_nr using hash on zespoly (nrz)
3.6 Usuwanie obiektów z bazy danych:
Polecenie to usuwa odpowiedni obiekt z bazy danych:
DROP TABLE tbl_name - usuwa wyspecyfikowana tabelę, wszystkie synonimy i indeksy
zdefiniowane dla tej tabeli i wszystkie przywileje związane z tabelą. Wszystkie perspektywy,
które odnosiły się do kolumn tej tabeli zostają również automatycznie usunięte. W bazie
danych, w której zdefiniowano więzy integralności referencyjnej automatycznie znikają
klucze obce odnoszące się do usuwanej tabeli.
DROP VIEW - usuwa definicję perspektywy z systemowego katalogu; automatycznie
usuwane są wszystkie perspektywy bazujące na kolumnach perspektywy usuwanej oraz
odnoszące się do niej przywileje użytkowników.
DROP INDEX - usunięcie indeksu; nie wpływa na zawartość tabeli.
Przykłady:
drop view prac_zesp_5
drop index prac_nrz
4 Uprawnienia użytkowników
4.1
Użytkownicy
Do zarządzania kontami użytkowników służą polecenia:
CREATE USER user [IDENTIFIED BY [PASSWORD] 'password'] – tworzące konto
uzytkownika.
RENAME USER old_user TO new_user – umożliwiające zmianę nazwy użytkownika.
DROP USER user – usuwające konto użytkownika.
SET PASSWORD [FOR user] = { PASSWORD('some password') | OLD_PASSWORD('some
password') | 'encrypted password'} – pozwala przypisać hasło istniejącemu użytkownikowi.
Przykłady:
create user basia identified by bbb
drop user basia
4.2 Przywileje dotyczące tabel
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user [IDENTIFIED BY [PASSWORD] 'password']
[WITH with_option [with_option] ...]
To polecenie daje użytkownikowi jedno lub więcej uprawnień dotyczących object_type:
TABLE | FUNCTION | PROCEDURE z opcją np. GRANT OPTION. Typy uprawnień
dotyczą (priv_level) m.in.: * | *.* | db_name.* | db_name.tbl_name | tbl_name.
Odpowiednio do odbieranie uprawnień służy instrukcja REVOKE:
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] priv_level
FROM user [, user] ...
Przykłady:
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost';
4.3
Rola perspektyw w ochronie danych przed niepowołanym dostępem
Perspektywy bywają tworzone w bazie danych w celu uszczegółowienia uprawnień
użytkowników na poziomie danych w tabeli. Nadając uprawnienia do perspektywy, a nie tabeli
bazowej można zarządzać prawami w odniesieniu do poszczególnych kolumn, a nawet wierszy
(gdy perspektywa jest tworzona z niepustymi warunkami selekcji we frazie WHERE).