Upload
ana-janicevska
View
91
Download
7
Embed Size (px)
DESCRIPTION
bazi podatoci - naprd_sql
Citation preview
Нaпреден SQL
2
Некои посебности на SET операции
Најди курс кој се оддржувал во есен 2009 година или лето 2010 година
Најди курс кој се оддржувал во есен 2009 но не лето 2010
(select course_id from section where sem = ‘Fall’ and year = 2009) union(select course_id from section where sem = ‘Spring’ and year = 2010)
Најди курс кој се оддржувал во есен 2009 и лето 2010
(select course_id from section where sem = ‘Fall’ and year = 2009) intersect(select course_id from section where sem = ‘Spring’ and year = 2010)
(select course_id from section where sem = ‘Fall’ and year = 2009) except(select course_id from section where sem = ‘Spring’ and year = 2010)
3
Некои посебности на SET операции
Пример база
4
Пример
Надите сите имиња на branches кои имаат поголема вредност на assets од колку сите branches лоцирани во Brooklyn.
select branch-namefrom branchwhere assets > all
(select assetsfrom branchwhere branch-city = ‘Brooklyn’)
5
Некои посебности на SET операции
F <comp> some r t r s.t. (F <comp> t)Каде <comp> е еден од:
056
(5< some ) = true
05
0
) = false
5
05(5 some ) = true (since 0 5)
(5 < од некои редициво релација)
(5< some
) = true(5 = some
(= some) inHо ( some) not in
6
Некои посебности на SET операции (1)
F <comp> all r t r (F <comp> t)
056
(5< all ) = false
610
4
) = true
5
46(5 all ) = true (since 5 4 and 5 6)
(5< all
) = false(5 = all
( all) not inHo (= all) in
7
Тест за немање дупликати
unique тестира постоење дупликати во табела. Да се најдат сите customers кои имаат најмногу една сметка во
филијала Perryridge.
select T.customer-name from depositor as T where unique (
select R.customer-name from account, depositor as R where T.customer-name = R.customer-name and
R.account-number = account.account-number and account.branch-name = ‘Perryridge’)
8
Пример
Наjдите сите имиња на branches кои имаат поголема вредност на assets од некои branches лоцирани во Brooklyn.
select branch-namefrom branchwhere assets > some
(select assetsfrom branchwhere branch-city = ‘Brooklyn’)
Исто што и select distinct T.branch-namefrom branch as T, branch as Swhere T.assets > S.assets and S.branch-city = ‘Brooklyn’
9
Креирање табели
SQL табела (relation) се дефинира со create table команда:
create table r (A1 D1, A2 D2, ..., An Dn,(integrity-constraint1),...,(integrity-constraintk))
– r име на релација
– секоја Ai е име на атрибут во шема за релацијата r
– Di е тип на податоци во доменот на вредности на атрибутот Ai
Пример:
create table branch(branch-name char(15) not null,branch-city char(30),assets integer)
10
Авторизациска спецификација во SQL
grant наредба за авторизација
grant <листа провилегии>
on <име релација или поглед> to <корисничка листа> <user list> е:
– user-id
– public, дозволува на сите валидни корисници привилегии кои се дадени
– рола
Давање привилеги на погледи не значи давање на привилегии на релации
Tој што може да дава привилегии, мора да има исти привилегии или повисоко, или да е администратор на БП
11
Правилата за интегритет дефинирани при креирање табели
Пример: декларираме branch-name како примарен клуч за branch и обезбедуваме assets >=0.
create table branch(branch-name char(15),branch-city char(30)assets integer,primary key (branch-name),check (assets >= 0))
not null primary key (A1, ..., An)
check (P), where P is a predicate
12
Ограничувања на домени
Domain constraints најелементарен облик на ограничувања на интегритет.
Примери креирање нови домени за постоечки типови податоци – промер: create domain Dollars numeric(12, 2)
create domain Pounds numeric(12,2)
Тие две вредности не можат да се споредуваат – Може да извршиме конверзија
(cast r.A as Pounds) (може да се поможи со соодносот долар/ фунта курс)
13
Ограничувања на интегритет
Можноста за редукција на грешки при внес на податоци – account мора да има баланс поголем од $10,000.00
– salary мора да е помала од $4.00 на час
– Клиент мора на има non-null телефонски број
14
Ограничувања на една релација
not null primary key unique check (P ), where P is a predicate
15
Not Null ограничување
дефинираме branch_name за branch е not null
branch_name char(15) not null
Дефинираме доменот на Dollars да биде not null
create domain Dollars numeric(12,2) not null
16
Ограничувања на една релација
unique ( A1, A2, …, Am)
Обезбедува атрибутите
A1, A2, … Amда формираат кандидат клуч. Тоа не значи дека ќе го избереме и за примарен клуч.
17
Check нредба
check (P ), where P е predicate
Пример (како порано)
create table branch (branch_name char(15), branch_city char(30), assets integer, primary key (branch_name), check (assets >= 0))
18
Референцијален интегритет
Обезбедува да вредноста на надворешен клуч (множество атрибути) на една табела се појавува како вредноста на едно множество атрибути во друга релација – Пример: Ако “Perryridge” е branch име во редица во account
табела, тогаш постои редица во branch табела за branch “Perryridge”.
Primary, candidate keys и foreign keys се дефинираат како дел од SQL create table наредбата:– primary key clause листа атрибути кои формираат primary key.
– unique key clause листа атрибути кои се candidate key.
– foreign key clause листа атрибути кои се foreign key како и име на релација која ја референцираат. По default, foreign key референцира primary key атрибут во референцирана релација.
19
Референцијален интегритет во SQL – Пример
create table customer(customer_name char(20),customer_street char(30),customer_city char(30),primary key (customer_name ))
create table branch(branch_name char(15),branch_city char(30),assets numeric(12,2),primary key (branch_name ))
20
Референцијален интегритет во SQL – Пример (1)
create table account(account_number char(10),branch_name char(15),balance integer,primary key (account_number), foreign key (branch_name) references branch )
create table depositor(customer_name char(20),account_number char(10),primary key (customer_name, account_number),foreign key (account_number ) references account,foreign key (customer_name ) references customer )
21
Assertions
Assertion e предикатен израз со услов кој сакаме секогаш да е задоволен на една база податоци
Аssertion во SQL има следната форма
create assertion <assertion-name> check <predicate> Тест на валидност, се изведува при секоја промена во база која
може да наруши правилото.– Ова може да побарува доста ресурси и време зато треба да
се користи со внимание.
Asserting for all X, P(X)
Или алтернативно
not exists X such that not P(X)
22
Assertion пример
Секој заем (loan) има барем еден клиент (borrower) кој оддржува сметка (account) со минимум balance $1000.00
create assertion balance_constraint check (not exists ( select *
from loan where not exists (
select * from borrower, depositor, account where loan.loan_number = borrower.loan_number
and borrower.customer_name = depositor.customer_name and depositor.account_number = account.account_number and account.balance >= 1000)))
23
Assertion пример (1)
Сума на сите позајмици (loan) за секоја филиала (branch) мора да биде помала од сума на сите вредности на сметки за секоја филијала (account balances).
create assertion sum_constraint check (not exists (select * from branch
where (select sum(amount ) from loan
where loan.branch_name = branch.branch_name )
>= (select sum (amount ) from account
where loan.branch_name = branch.branch_name )))
24
Авторизација (Authorization)
Постојат следните форми на автризација во БП:
Read – дозволува читање, но не модификација на податоци, Insert – дозволува вметнување нови податоци, но не модификација
на постоечкиу податоци, Update – дозволува модификација, но не бришење на податоци, Delete – дозволува бришење податоци.
Форми на ауторизација за промена на шема на БП: Index – дозволува креирање, менување индекси, Resources – дозволува менување нови релации, Alteration – дозволува додавање или бришење атрибути во релација, Drop – дозволува бришење на релација.
25
Привилегии во SQL
select: дозволува read access за релација, или можност за пребарување со користење view. Пример:– Доделување на корисниците U1, U2, и U3 select авторизација
на branch релација:
grant select on branch to U1, U2, U3
insert: за insert update: за update delete: за delete. all privileges: кратка форма за сите привилегии
26
Повлекување (Revoking) авторизација во SQL
Се користи revoke наредба за да се повлече авторизација.revoke <листа привилегииt>
on <име релација или поглед> from <корисничка листа>
Пример:revoke select on branch from U1, U2, U3
<листа привилегии> може да биде all за повлекување сите привилегии.
Ако<revoke-листа> вклучува public, сите корисници губат привилегии освен оние кои имаат експлицитна авторизација
Ако корисник добил привилегии од повеќе овластени лица за давање на авторизација при употреба на една revoke наредба од едно овластено лице, може да задржи привилегии дадени од друго овластено лице. Важи и за исти привилегии.
Сите привилегии кои зависат од дадени привилегии исто така се повлекуваат
27
Embedded SQL
Најважна можност за правење апликации е SQL standard кој дефинира вклучување (embedding) на SQL наредби во различни програмски јазици C, C#, Java, Delphi....
Повикувачки јазик се нарекува host language а SQL структура во тој јазик е составена од embedded SQL.
EXEC SQL наредбата се користи за идентификација на embedded SQL барање до предпроцесор
EXEC SQL <embedded SQL statement > END_EXEC
Забелешка: ова се разликува во различни јазици на пример Java embedding користи # SQL { …. };
28
Пример Query
Специфицирајте прашање во SQL и декларирајте променлива cursor за преземање одговор
EXEC SQL declare c cursor for select depositor.customer_name, customer_city from depositor, customer, account where depositor.customer_name = customer.customer_name and depositor account_number = account.account_number
and account.balance > :amount END_EXEC
Најголем предизвик кај јазикот домаќин е начин на профаќање на резултат со оглед на расположиви структури на податоци. Во случајов е декларирана променлива c како cursor
Од јазикот домаќин да се најдат имиња и градови на клиенти кои на сметки имаат повеќе од вредност дадена во променливата amount.
29
Embedded SQL (1)
Наредбата open обезбедува евалуација на прашањето
EXEC SQL open c END_EXEC Наредбата fetch обезбедува редицата (одговор на прашањето) да
се смести во јазик домаќин.
EXEC SQL fetch c into :cn, :cc END_EXEC
Повторување на fetch обезбедува добивање сукцесивни редици Променливата SQLSTATE во SQL комуникациско подрачје
(SQLCA) се поставува на ‘02000’ за да означи дека нема веќе податоци.
Наредбата close брише привремена табела (покажувач) која содржи резултат
EXEC SQL close c END_EXEC
Забелешка: овие елементи се различни кај различни јазици
30
SQL Views (погледи)
SQL view е виртуелна табела која се конструира од други реални табели во БП. Нема сопствени податоци, но во време на користење (извршување) црпи податоци од постоечки табели или други погледи.
Улога– Скривање одредени колони или редици– Доделување различни нивоа на дозволи за пристап до иста табела– Доделување различни тригери на разлини погледи на иста табела– Приказ на резиултати од пресметки– Надминување проблеми со комплицирани SQL
create view v as <query expression>
v е назив на погледquery expression e валиден израз
31
Пример креирање поглед
Поглед кој содржи сите branches и нивни customerscreate view all-customer as
(select branch-name, customer-name from depositor, account where depositor.account-number = account.account-number)
union (select branch-name, customer-name from borrower, loan where borrower.loan-number = loan.loan-number)
Прашање поставено на поглед
select customer-namefrom all-customerwhere branch-name = ‘Perryridge’
32
Ажурирање поглед
Ажурирање погледи е дозволено ако– Поглед се базира на една табела без колони со null вредности во
погледот– За останатите случаи постојат посебни правила и ограничувања и
затоа или не се дозволени или не се препорачуваат–
Пример креирање сите loan data во loan релацијаta со скриен атрибут amount
create view branch-loan asselect branch-name, loan-numberfrom loan
Додавање редица во поглед branch-loaninsert into branch-loan
values (‘Perryridge’, ‘L-307’)Ова се реализира со вметнување редица
(‘L-307’, ‘Perryridge’, null)во табелата loan на која се базира погледот
33
Тригери (Triggers)
TriggerСкладиран програм кој се извршува од ДБМС кога се случува некој настан. Тригер се извршува секогаш кога некој настан ќе се случи, на пример кога ќе се вметне редица во одредена табела.
Поврзан е со табела (релација) или поглед (view) Постојат три типа на тригери: BEFORE, INSTEAD OF и AFTER Секој од овие три типа може да биде деклариран за наредбите
INSERT, UPDATE, и/или DELETE Кога се активира тригер ДБМС обезбедува
– Стари и нови вредности за UPDATE– Нови вредности за INSERTS– Стари вредности за DELETE
34
Користење тригери
Обезбедува покомплексни default вредности Обезбедува контрола за ограничувања и дефинира default вредности Ажурира погледи (views) Обезбедува референцијален интегритет SQL Server на пр.поддржува 6 типа тригери (само за AFTER и
INSTEAD OF тригери)
Генеричка синтакса (скратена) за тригер
CREATE TRIGGER trigger_name ON table_or_view_name AFTER | BEFORE | INSTEAD OF INSERT | UPDATE | DELETE AS trigger_code
35
Целосна синтакса за тригер
CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ WITH APPEND ] [ NOT FOR REPLICATION ] AS [ { IF UPDATE ( column ) [ { AND | OR } UPDATE ( column ) ] [ ...n ] | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask ) { comparison_operator } column_bitmask [ ...n ] } ] sql_statement [ ...n ] } }
36
Пример
CREATE TRIGGER trig_addAuthor ON authors FOR INSERT AS
-- Get the first and last name of new author DECLARE @newName VARCHAR(100) SELECT @newName = (SELECT au_fName + ‘ ' + au_lName FROM Inserted)
-- Print the name of the new author PRINT 'New author "' + @newName + '" added.'
Креира нов тригер со име trig_addAuthor за табела authors кој ќе се активира при INSERT
Може да се дефинира истовремено користење за INSERT, DELITE, UPDATE
При извршување на наредбата INSERT се креира виртуелна табела со имe INSERTED за табелата authors со соодветни атрибути.
При вметнување секоја нова редица во табелата authors се повикува тригер кој во случајов испишува: New author име презиме added
37
Пример (1)
Нека pubs е назив на база во која се наоѓа табела authors
За тестирање на новиот тригер од командна линија во Query Analyzer (Start -> Programs -> Microsoft SQL Server 7.0 -> Query Analyzer) и конекција кон базата:
USE pubs GO
SET NOCOUNT ON
INSERT INTO authors(au_id, au_lname, au_fname, phone, address, city, state, zip, contract) VALUES('172-85-4534', 'Doe', 'John', '123456', '1 Black Street', 'Doeville', 'CA', '90210', 0)
38
Пример (3)
39
Пример за UPDATE
CREATE TRIGGER trig_updateAuthor ON authors FOR UPDATE AS
DECLARE @oldName VARCHAR(100) DECLARE @newName VARCHAR(100)
IF NOT UPDATE(au_fName) AND NOT UPDATE(au_lName) BEGIN RETURN END
SELECT @oldName = (SELECT au_fName + ' ' + au_lName FROM Deleted) SELECT @newName = (SELECT au_fName + ' ' + au_lName FROM Inserted)
PRINT 'Name changed from "' + @oldName + '" to "' + @newName + '"'
Се креираат две нови променливи: oldName (ќе содржи вредности пред промената) и newName ќе содржи вредности по промената. UPDATE тригер проверува дали "au_fName" и "au_lName“ полиња се ажурирани со "UPDATE" SQL query. Се извршува тригер "trig_updateAuthor" trigger. Ако нема ажурирање се враќа контрола на SQL server. Ако има ажурирање и на двете полиња au_fName и au_lName се земаат нивни стари имиња од табелата DELETED I se ставаат во променливата oldName, додека новите ажурирани вредности се земаат од тавелата INSERTED и се ставаат во newName. Потоа и двете вредности се печатат
40
Пример тригер за дефинирање ограничувања
Arenas (ArenaID, ArenaName, City, ArenaCapacity), ArenaCapacity >= 5000
CREATE TRIGGER minseating ON Arenas /*trigger associated to Arenas*/FOR INSERT /*executed after an insert*/ASDECLARE @capacity as int /*variable declarations */
SELECT @capacity = ArenaCapacity /* get values inserted */FROM insertedif @capacity < 5000BEGINROLLBACK /*undo the insert*/Print 'Arena too small‘ /*message for the user*/END
41
Тригер за интегритет на табелата
42
43
Складирани процедури (Stored Procedures)
Stored procedure Е програм кој е складиран во рамките на база и се компајлира во моментов на
користење Може да прифаќа влезни параметри и може да враќа резултати Може да се повикува:
– некој стандарден јазик– скриптирачки јазик– SQL command prompt
За креирање– ORACLE во PL/SQL или Java– SQL Server воTRANSACT-SQL
За повикување: – Во ORACLE PL/SQL или Java– Во скриптирачки јазици JavaScript, VBScript– На SQL команден промпт (SQL*Plus ORACLE, Query Analyzer SQL Server
44
Предности на stored procedure
Поголема сигурност, бидеќи се складираат на ДБ сервер SQL се оптимизира со DBMS compiler Помал пренос податоци низ мрежа Делење на код резултира со:
– Помалку работа
– Стандардизирање на процесирање
– Специјали на развоен тим
45
Креирање и повикување на stored procedure
CREATE PROCEDURE proc_name
AS proc_code
exec proc_name [@param1 = ]value1, …
Има мали варијации во варианти на SQL на различни ДБМС
Пример:
Performers (PerformerID, PerformerName, Street, City, State, Zip)
опис: Се вметнива performer само ако name и zip не се веќе во табелата
46
Performers (PerformerID, PerformerName, Street, City, State, Zip, ActivityID)
CREATE PROCEDURE performer_Insert(@ID int,
@NewName char(20),
@street char(20),
@city char(15),
@state char(2),
@NewZip int)
AS
DECLARE @Count as int
SELECT @Count = Count(*)
FROM Performers
WHERE PerformerName=@NewName
AND Zip = @NewZip
IF @Count > 0 BEGIN PRINT 'Performer is already in the Database' RETURN END BEGIN TRANSACTION INSERT INTOPerformers(PerformerID,PerformerName, Street, City, State, Zip) VALUES (@ID, @NewName, @street, @city, @state, @NewZip)PRINT 'Performer added to database'COMMIT
exec performer_Insert @ID = 10, @NewName = 'James Brown', @street ='Main', @city ='Aiken', @state ='SC', @NewZip = 54322
47
Triggers vs. Stored Procedures
Тригери Се примери на код (програми) кои се повикуваат од страна на ДБМС
само при INSERT, UPDATE и DELITE команди Придружени се на одредена табела или поглед (view) Во зависноста од ДБМС може да имаме еден или повеќе тригери за
една табела или поглед Со повикување еден тригер (на пример при INSERT) може да се
провоцира повикување на некој друг тригер Складирани процедури Се примери на код кои ги повикува корисник или ДБА администратор Се однесува на база податоци (не само на одделна табела или поглед) Може да се користи и кај INSERT, UPDATE и DELITE команди Најчесто се користи за административни работи на база или како дел
на апликација
48
Triggers vs. Assertions
Assertions се моќни, но најчесто не може да одредиме кога и колку проверки ќе бидат изведени.
Чекирања на атрибути и терки можат да се прердвидат но не се толку моќни алатки
Тригери овозможуваат одлуки за проверки да носат корисници