Aspekty aktywne baz danych Aktywne aspekty baz danych • Baza danych powinna zapewniać pewne własności i niezmienniki; • Własności te powinny mogą być zapisane do bazy danych, a baza danych powinna zapewniać sama, żeby były spełnione; • Baza danych powinna się sama bronić przed wprowadzeniem błędnych danych. Spójność bazy danych • Spójność oznacza poprawność, niesprzeczność danych w bazie danych. Standard SQL zawiera środki do definiowania warunków spójności (lub więzów integralności), np. w obrębie zdania CREATE TABLE. • Każda próba naruszenia zdefiniowanych warunków spójności (podczas modyfikacji bazy danych) zostaje udaremniona, operacja ją podejmująca jest odrzucana, a baza danych pozostaje niezmieniona. • W systemie pamiętana jest więc baza danych (dane podstawowe) oraz wiedza o bazie danych (dane opisujące struktury i warunki spójności). Rodzaje warunków spójności • • • • • • Typ kolumny – typ może być standardowy lub pochodny zdefiniowany przez użytkownika. UNIQUE – dla określenia, że kolumna lub zestaw kolumn ma mieć unikalną wartość w tabeli (jest kluczem potencjalnym - alternatywnym, kandydującym – w tabeli), taki klucz może przyjmować wartości NULL. PRIMARY KEY – specjalny przypadek UNIQUE dla zdefiniowania klucza głównego – nie może przyjmować wartości NULL. FOREIGN KEY - dla zdefiniowania zależności referencyjnych (zależności odniesień). Wartość klucza obcego musi występować jako wartość klucza głównego w powoływanej tabeli. CHECK - dla określenia, że kolumna lub zestaw kolumn (z jednej krotki) mają mieć wartości spełniające określony warunek. Taka spójność może być zdefiniowane jako reguła w wyrażeniu CREATE RULE. Wyzwalacze - bardziej złożone warunki spójności można definiować za pomocą procedur wyzwalanych w wyrażeniach CREATE TRIGGER. Procedury te są automatycznie wyzwalane przy aktualizacji tabeli. Typy danych w SQL Server • char(n), nchar(n) – tekst o ustalonej długości n znaków; • varchar(n), nvarchar(n) – tekst o długości co najwyżej n znaków; • binary(n) – binarny ciąg znaków o długości n znaków • varbinary(n) - binarny ciąg znaków o długości co najwyżej n znaków; • bigint, int, smallint, tinyint – liczba całkowita; • bit – przyjmuje wartość 0, 1, NULL; • float (8 bytes), real(4 bytes) – liczby zmiennopozycyjne; • decimal(n, d), numeric(n, d) – dane numeryczne: n miejsc na liczby całkowite, d na ułamkowe; • datetime, smalldatetime – typ daty; Elementy aktywne • Klucze (primery key,unique) • Integralność referencyjną i klucze obce (foreign key) • Więzy wartości atrybutów – Więzy NOT-NULL – Więzy CHECK – Więzy dziedziny • Wyzwalacze (triggery) Klucze Klucze jednoznacznie identyfikują relację. Klucze mogą być proste i złożone. Relacja: Osoba (Nazwisko, Imie, DataUr, NIP, PESEL, Adres) •Klucz złożony: {Nazwisko, Imie, DataUr} •Klucz prosty: {PESEL}, {NIP}, •Klucz sztuczny: {OsID} Klucze kandydujące, jeden klucz główny Klucz główny: powinien być prosty, wartości nie powinny zawierać białych znaków, wartość klucza nie powinna się zmieniać, powinien być oparty o wartość numeryczną. Definiowanie schematu bazy danych create table Osoba( Nazwisko nchar(20), Imie nchar(20), DataUr datetime, NIP nchar(20), PESEL nchar(20)) Tworzenie tabeli z kluczami create table Osoba( Nazwisko nchar(20) primary key, Imie nchar(20), DataUr datetime, NIP nchar(20) unique, PESEL nchar(20) unique) Atrybut Nazwisko jest kluczem głównym (primary key) Atrybuty NIP, PESEL – posiadają wartości unikalne (unique) Definiowanie tabeli ze złożonym kluczem głównym create table Osoba( Nazwisko nchar(20), Imie nchar(20), DataUr datetime, NIP nchar(20) unique, PESEL nchar(20) unique, primary key (Nazwisko, Imie)) Wartość (Nazwisko, Imie) jest kluczem głównym (primary key) Atrybuty NIP, PESEL – posiadają wartości unikalne (unique) Dodawanie kolumny z własnością IDENTITY ALTER TABLE Osoba ADD OsobaId INT IDENTITY ( 200, 2) • ADD – dodawanie kolumny; • IDENTITY [ (seed , increment) ] – Seed – wartość pierwszego wiersza załadowanego do tabeli; – Increment – inkrementacja wartości przy każdym następnym ładowaniu danych. • IDENTITY stosuje się przy definiowaniu kluczy sztucznych. • Wykonanie następujących instrukcji spowoduje: insert into Osoba values ('Padewski', 'Marek', '1971-01-06', 1111, 1234) insert into Osoba values ('Nijaki', 'Przemyslaw', '1971-03-12', 2222, 8980) Osoba Definiowanie tabeli z kluczem obcym create table Studio( Nazwa nchar(20) primary key, Kierownik nchar(20) references dbo.Osoba(Nazwisko)) • Zależność pomiędzy kluczem głównym jednej tabeli a atrybutem w drugiej tabeli nazywa się zależnością referencyjną. Ograniczenia zależności referencyjnej • Atrybuty klucza obcego muszą być zadeklarowane jako klucz główny w oryginalnej relacji. – W tym przypadku Kierownik z relacji Studio odnosi się do atrybutu Nazwisko z relacji Osoba, który jest kluczem głównym. Ograniczenia zależności referencyjnej Osoba Studio • Wartość atrybutu klucza obcego musi wystąpić również jako wartość klucza głównego w drugiej relacji. – W tym przypadku każda wartość występująca w kolumnie Kierownik musi wystąpić jak wartość Nazwisko. Usuwanie powiązanych krotek Osoba Studio delete from Osoba where Nazwisko = 'Nijaki‘ Wykonanie instrukcji spowoduje błąd, gdyż w relacji Studio byłaby taka wartość w kolumnie Kierownik, której nie byłoby w atrybucie Nazwisko relacji Osoba. Usuwanie powiązanych krotek • Aby uniknąć tej sytuacji, można zdefiniować relację w sposób następujący: create table Studio( Nazwa nchar(20) primary key, Kierownik nchar(20) references dbo.Osoba(Nazwisko) ON DELETE SET NULL) Usuwanie powiązanych krotek Osoba Studio delete from Osoba where Nazwisko = 'Nijaki‘ W wyniku operacji będzie: Osoba Studio Usuwanie powiązanych krotek • Można zdefiniować kaskadowe usuwanie krotek: create table Studio( Nazwa nchar(20) primary key, Kierownik nchar(20) references dbo.Osoba(Nazwisko) ON DELETE CASCADE) Usuwanie powiązanych krotek Osoba Studio delete from Osoba where Nazwisko = 'Nijaki‘ Osoba Studio Modyfikowanie powiązanych krotek • Można zdefiniować kaskadowe modyfikowanie krotek: create table Studio( Nazwa nchar(20) primary key, Kierownik nchar(20) references dbo.Osoba(Nazwisko) ON DELETE CASCADE ON UPDATE CASCADE) Zastosowanie ON UPDATE CASCADE spowoduje, że zmiana nazwiska w krotce Osoba, spowoduje zmianę w krotce Studio. Modyfikowanie powiązanych krotek Osoba Studio update Osoba set Nazwisko = 'Madej' where Nazwisko = 'Padewski' Osoba Studio Ograniczenia na wartościach atrybutów ALTER TABLE Osoba ADD Date smalldatetime NULL CONSTRAINT AddDateDflt DEFAULT GETDATE() WITH VALUES Dodawana jest kolumna Date typu smalldate mogąca przyjmować wartość NULL. Wartość domyślna jest ustawiana na obecną datę (GETDATE()). Dodatkowo WITH VALUES ustawia wartość domyślą we wszystkich istniejących krotkach. Ograniczenia CHECK • CHECK <condition> – condition – warunek definiowany podobnie jak przy WHERE; • Ograniczenia typu CHECK mogą być nakładane na atrybuty. • Zmiana wartości ograniczonego atrybutu może nastąpić tylko wtedy, gdy warunek jest spełniony. Ograniczenia CHECK • alter table Osoba add NIP1 int check (NIP1>100) – Zostanie zaakceptowana tylko taka wartość atrybutu NIP1, która jest większa od 100. • alter table Osoba add Plec char(2) • alter table Osoba Add constraint P1 check (Plec IN ('K', 'M')) – Dodawanie ograniczenia na kolumnę Plec • alter table Osoba Add constraint P2 check (PESEL>NIP) – Sprawdzane są zawsze przy wstawianiu i modyfikowaniu krotki relacji. Jeśli warunek jest fałszywy wówczas operacja nie powiedzie się. Warunki nałożone są na krotki. • Usuwanie ograniczeń: – alter table Osoba drop constraint P1 Więzy dziedziny W SQL3: CREATE DOMAIN DziedzinaPlci CHAR(1) CHECK (VALUE IN ('K', 'M')) – Można zdefiniować kolumnę o danej dziedzinie. Np.: Plec DziedzinaPlci Asercje • Wszystkie dotychczasowe więzy dotyczyły pojedynczej krotki (więzy wartości atrybutów), ewentualnie prostych związków między krotkami z różnych relacji (więzy integralności); • Jeśli jest potrzeba dodania bardziej skomplikowanych zależności pomiędzy krotkami z różnych relacji, wówczas można zastosować asercje. Asercje create assertion BogatyPrezes check (NOT exists (select * from Studio, Osoba where Studio.Nazwisko = Osoba.Nazwisko and Kapital < 10000)) – Warunek oznacza, że nie powinien istnieć prezes, którego kapitał jest mniejszy od 10000. Sekwencje CREATE SEQUENCE ID_Seq START WITH 24329 INCREMENT BY 1 MINVALUE 24329 MAXVALUE 24332 CYCLE; GO SELECT NEXT VALUE FOR ID_Seq; CREATE TABLE Sequence_Table (Sequence_Table_id INTEGER DEFAULT NEXT VALUE FOR ID_Seq, code VARCHAR(15) NOT NULL ); Wyzwalacze (triggers) • Reguły ECA (Event – Condition – Action) • Asercje są drogie – system sam decyduje kiedy powinny być wykonywane; • Wyzwalacze są mechanizmami bardziej elastycznymi – użytkownik sam decyduje kiedy mają być wywoływane; • Wyzwalacze są testowane tylko przy zajściu określonego zdarzenia (dołączanie, usuwanie, modyfikacja krotki) określonego przez programistę (projektanta bazy); • Jeśli warunek zostanie spełniony to przetwarzana jest akcja związania z wyzwalaczem. Wyzwalacze - przykład • Dodajemy kolumnę Placa do tabeli Osoba, oraz kolumnę Kapitał w tabeli Studio. • Reguła: – Przy każdej zmianie płacy osoby. Jeśli płaca osoby się zwiększa i ta osoba jest kierownikiem jakiegoś Studia, wówczas zwiększamy Kapitał o poprzednią płacę kierownika • W standardzie SQL3 mamy następujący wyzwalacz: CREATE TRIGGER TrgKapital AFTER UPDATE OF Placa ON Osoba REFERENCING OLD AS Stara NEW AS Nowa WHEN (Stara.Placa < Nowa.Placa) UPDATE Studio SET Kapital= Kapital + Stara.Placa WHERE Kierownik = Nowa.Nazwisko FOR EACH ROW Wyzwalacze - przykład • Reguła: – Przy każdej zmianie płacy osoby. Jeśli płaca osoby się zwiększa i ta osoba jest kierownikiem jakiegoś Studia, wówczas zwiększamy Kapitał o poprzednią płacę kierownika • W T-SQL mamy następujący wyzwalacz CREATE TRIGGER TrgKapital ON Osoba AFTER UPDATE AS BEGIN IF Update(Placa) IF ((SELECT Placa FROM deleted) < (select Placa from inserted)) UPDATE Studio SET Kapital= Kapital + (select Placa from deleted) WHERE Kierownik = (select Nazwisko from inserted) END Wyzwalacze - przykład • Reguła: – Przy każdej zmianie płacy osoby. Jeśli płaca osoby się zwiększa i ta osoba jest kierownikiem jakiegoś Studia, wówczas zwiększamy Kapitał o poprzednią płacę kierownika • W MySQL mamy następujący wyzwalacz CREATE TRIGGER UpStudio AFTER UPDATE ON Osoba FOR EACH ROW BEGIN If (OLD.Placa < NEW.Placa) THEN UPDATE Studio SET Kapital= Kapital + OLD.Placa WHERE Kierownik = NEW.Nazwisko; END IF; END Wyzwalacze • W standardzie SQL3 akcja może być wykonywana: – przed zajściem zdarzenia: BEFORE (wówczas warunek w WHEN jest sprawdzany przed zajściem zdarzenia) – po zajściu zdarzenia AFTER (wówczas warunek w WHEN jest sprawdzany po zajściu zdarzenia) . • Wyzwalacze mogą być nałożone na instrukcje INSERT, UPDATE oraz DELETE. • Jeśli wyzwalacz jest nałożony na UPDATE wówczas występuje słowo OF, które specyfikuje modyfikowaną kolumnę. Wyzwalacze – przykład2 • Reguła: – Przy każdym dodaniu osoby. Jeśli płaca osoby jest większa od średniego kapitału studia, wówczas należy dodać nowe studio dla dodawanej osoby. CREATE TRIGGER InsStudio ON Osoba AFTER INSERT AS BEGIN IF ((SELECT Placa FROM inserted) > (select avg(Kapital) from Studio)) BEGIN declare @nazwisko varchar(20) select @nazwisko = Nazwisko from inserted INSERT INTO Studio values (@nazwisko, @nazwisko,1000) END END Wyzwalacze – przykład2 • insert into Osoba values ('Koronowski', 'Andrzej', '1971-01-06', 1284, 5111, null, null, null, 9000) • insert into Osoba values ('Maryniak', 'Krzysztof', '1971-01-06', 121, 51113, null, null, null, 50000) Pierwszy INSERT nie spowoduje dodania nowej krotki w relacji Studio. Drugi INSERT spowoduje dodania nowej krotki w Studio. Wyzwalacze – przykład3 • Reguła: – Przy każdym usuwaniu osoby. Jeśli płaca usuwanej osoby jest większa od średniej płacy wszystkich osób, wówczas można tę osobę usunąć. CREATE TRIGGER DelStudio ON Osoba INSTEAD OF DELETE AS BEGIN IF ((SELECT Placa FROM deleted) > (select avg(Placa) from Osoba)) delete from Osoba where Nazwisko = (select Nazwisko from deleted) END Wyzwalacze – przykład2 • delete from Osoba where Nazwisko = 'Koronowski' • delete from Osoba where Nazwisko = 'Maryniak‘ Pierwszy DELETE nie spowoduje usunięcia krotki. Drugi DELETE spowoduje usunięcie jednej krotki z tabeli Studio i jednej z tabeli Osoba. Dziękuję