P. 1
Lab8_bazi

Lab8_bazi

|Views: 4|Likes:
Published by Vladimir Filev
10._Arhetipi_Algoritmiv200 m 10._Arhetipi_Algoritmiv200 10._Arhetipi_Algoritmiv200v10._Arhetipi_Algoritmiv20010._Arhetipi_Algoritmiv20010._Arhetipi_Algoritmiv200v
10._Arhetipi_Algoritmiv200 m 10._Arhetipi_Algoritmiv200 10._Arhetipi_Algoritmiv200v10._Arhetipi_Algoritmiv20010._Arhetipi_Algoritmiv20010._Arhetipi_Algoritmiv200v

More info:

Categories:Types, School Work
Published by: Vladimir Filev on Jun 25, 2013
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PPTX, PDF, TXT or read online from Scribd
See more
See less

06/25/2013

pdf

text

original

Создавање на погледи – планирање и создавање на упити за погледи.

Промена на погледи
Тригери
Лабораториска вежба 8
Содржина
• Создавање на погледи
• Промена на погледи
• Бришење на погледи
• Промена на податоци преку погледи
• Создавање на тригер
• Забрана, разрешување, промена и бришење на тригер
• Каскадни и рекурсивни тригери
• Користење на тригери за исполнување на дејствија за зачувување на
целост на податоците
• Tригери за табела која ре]ерира
• Tригери за ре]ерираната табела
• Задача
2
Погледи
• За разлика од постојаните базови таблици, кои содржат постојани
податоци, кој се чуват во базата на податоци, погледите се друг
вид на табели. Погледите (views) се табели, чија содржина се зема
или пополнува од други табели. Познати се под името виртуелни
таблици. Mоже да се направи упит кон поглед преку
конструкциите SELECT, INSERT или друг вид конструкција како
што се прави обраxање кон базова таблица со таа разлика што
погледите не содржат собствени податоци. Погледот преставува
упит, кој се извикува за исполнување секогаш кога во некоја
конструкција се извршува препраxање кон тој поглед. Hзлезните
податоци на тој упит ја ]ормира содржината на погледот.
3
Создавање на погледи
• ¡е]инирањето на поглед се извршува со помош на конструкцијата CREATE
VIEW, која го има следниот општ вид:
CREATE VIEW view_name |(column_list)|
AS
SELECT statement
|WITH CHECK OPTION|
Пример: 1)
CREATE VIEW All¸Employees¸And¸Customers
AS
SELECT FirstName¹' '¹LastName AS Name, CompanyName
FROM Employees e
LEFT JOIN Sales s ON e.EmployeeID ÷ s.EmployeeID
FULL JOIN Customers c ON s.CustomerID ÷ c.CustomerID
4
• Oваа конструкција не генерира излезни податоци, туку потврда за создавање на
нов објект во базата на податоци. Создадениот поглед може да се користи како и
секоја друга табела. Mоже да се праxат упити кон неа, да се ажурира, да се
додават податоци, да се бришат податоци и да се соединува со други табели или
погледи. Пример:
SELECT * FROM All¸Employees¸And¸Customers
WHERE Name LIKE 'Ab°'
ORDER BY Name
• Поглед може да се создаде врз база на која и да е табела, како и врз база на кој и
да е друг поглед.
• Погледите ги зголемуваат можностите за контрола на податоците.
• Oвозможуват начин за достап до ограничен дел до ин]ормација од дадена табела.
• Погледите може да содржат GROUP BY или да се базират на други групирани
погледи. Iрупираните погледи дават можност за постојана обработка на
извлечените податоци. Hаместо постојано да се конструират сложени упити,
може само да се создаде соодветен поглед.
5
Пример:)
CREATE VIEW TotalForDay
AS
SELECT CONVERT(datetime,CONVERT(char(10),SaleDate,112))
AS DateOISale,
COUNT(DISTINCT CustomerID) AS CustomersCount,
COUNT(DISTINCT EmployeeID) AS EmployeesCount,
COUNT(SaleID) AS SalesCount,
AVG(TotalForSale) AS AverageTotal,
SUM(TotalForSale) AS SumTotal
FROM Sales
GROUP BY CAST(CONVERT(char(10),SaleDate,112)AS datetime)
• По создавање на погледи може да се користат упити кон погледи.
Пример:
SELECT * FROM TotalForDay
SELECT * FROM TotalForDay
WHERE SumTotal÷(SELECT MAX(SumTotal) FROM TotalForDay)
SELECT * FROM TotalForDay
WHERE SalesCount~÷2 AND SumTotal~÷1000
6
• Погледите може да користат и под-упити, вклучително и взаемно сврзани под-упити.
Пример:!)
CREATE VIEW MaxTotalForCustomer
AS
SELECT c.CustomerID, c.CompanyName, s.TotalForSale,
s.SaleDate
FROM Customers c
INNER JOIN Sales s ON c.CustomerID÷s.CustomerID
WHERE TotalForSale ÷
( SELECT MAX(TotalForSale)
FROM Sales s1
WHERE s.CustomerID ÷ s1.CustomerID )
Vпит кој де]инира поглед кој извлекува податоци за најголемото пазарување на
клиентите помеrу сите собствени пазарувања.
Пример за упит кон поглед:
SELECT * FROM MaxTotalForCustomer
WHERE CompanyName LIKE 'L°'
7
• Погледите може да се базират на неколку упити, комбинирани со операторот UNION.
Пример: ")
CREATE VIEW CityPeople
AS
SELECT CustomerID AS ID, CompanyName, City,
'customer' AS Name
FROM Customers
UNION
SELECT SupplierID, CompanyName, City, 'supplier'
FROM Suppliers
• Bклучуват се низи за да се постави етикета на секој ред, која покажува кој упит го
генерирал. Следниот упит кон поглед ги изведува тие редови за кој името на градот е во
зададен азбучен обxват:
SELECT * FROM CityPeople
WHERE City BETWEEN 'A' AND 'L'
ORDER BY City
8
• Hе може да се користи ORDER BY при де]инирањето на поглед.
Според стандардот излезните податоци од упитот ]ормират содржина
на поглед кој е копија на базовата таблица и по де]иниција е
неподредено. Vпитите кон поглед може да користат ORDER BY.
• Hсклучок прави поглед кој вклучува во де]иницијата TOP n.
Пример:
CREATE VIEW TopProductPrice
AS
SELECT TOP 3 WITH TIES ProductID, ProductName, Price
FROM Products
ORDER BY Price DESC
GO
SELECT * FROM TopProductPrice
9
Промена на погледи
• SQL Server дозволува да се промени де]иницијата на поглед:
ALTER VIEW view_name |(column_list)|
AS
SELECT statement
|WITH CHECK OPTION|

Погледот треба да постои, а укажаната де]иниција ја заменува таа
која е имал погледот пред изполнување на ALTER VIEW.

#ри$ење на погледи
DROP VIEW view_name
• Бришењето на погледи не укажува влијание над базовата табела од
која тој се ]ормира.
10
Промена на подато%ите преку посредување на погледи
• Mожно е моди]ицирање на редовите во табелата, на која е базиран некој поглед,
така што се користи самиот поглед. Постојат неколку ограничувања при промена
на податоци со посредување на погледи:
▫ Mоди]ицирањето е ограничено до една табела, т.е. конструкциите INSERT и UPDATE
се дозволени за погледи на множество табели, ако промената ја засега само една
табела. Конструкциите DELETE не се дозволени за погледи на множество табели.
▫ Hекој погледи се само за читање не може да се додават (INSERT) редови ниту да се
променуваат (UPDATE) колони од поглед, кој вклучуват ]ункции, UNION, клучов
збор GROUP BY или DISTINCT, како и колоните во поглед, кои се резултат на некој
изрази или резултат од вградени ]ункции.
▫ Промени и критериум за погледи по подразбирање конструкциите за промена на
податоци преку погледи не се проверуват, дали засегнатите редови се наоrаат во
обxватот на погледот. Пример конструкцијата INSERT за даден поглед , кој додава ред
во базовата табела, но не додава ред кон самиот поглед, кога вредностите на колоните
не одговарат на критериумите на погледот, но се валидни за табелата и можат да бидат
додадени, и покрај тоа што се преставени во селекцијата на погледот. Aналогно за
UPDATE. Aко треба сите промени да се проверуват, неопxодно е при создавањето на
погледот да се искористи опцијата WITH CHECK OPTION.
11
Пример:1)
CREATE VIEW Customers¸VT
AS
SELECT * FROM Customers
WHERE City ÷ 'Veliko Tarnovo'
WITH CHECK OPTION
• Oпцијата WITH CHECK OPTION се додава не само по однос на условот на погледот,
кој директно го содржи но и по однос на други погледи, кои тој поглед ги содржи.
Пример:)
CREATE VIEW Product¸List
AS
SELECT ProductID, ProductName, Price,
Stock, ReorderLevel, Discontinued
FROM Products
WHERE Discontinued ÷ 0
12
• ¡а предпоставиме дека треба да создадеме друг поглед, кој е базиран на предxодниот:
!) CREATE VIEW ProductsForReorder
AS
SELECT *
FROM Product¸List
WITH CHECK OPTION
• Hема да може после тоа да се изврши следното ажурирање:
UPDATE ProductsForReorder
SET Discontinued ÷ 1
WHERE ProductID ÷ 3
• Tаа не нарушува условот во погледот ProductsForReorder, но нарушава условот во
погледот Product¸List, на кој се базира.
• #ри$ење на ред во поглед води до бришење на ред од соодветната табела:
DELETE FROM ProductsForReorder
WHERE ProductID ÷ 12
13
Тригери
Тригер е специален вид зачувана процедура, која се стартира автоматски
од SQL Server при проба да се моди]ицират податоците, со кои тригерот
е поврзан (за разлика од зачуваните процедури, кои се исполнуваат само
кога бидат експлицитно повикани).

Tригерот може да биде подесен да се стартира, кога податоците бидат
променети по некаков начин, т.е. преку конструкцијата INSERT,
UPDATE или DELETE. За секое дејствие може да се де]инират
повеxе од еден тригер за дадената табела. Hема начин да се
контролира редот, по кој да се извикуват тригерите за една и иста
табела. Aко е од големо значење се определува стапка по стапка за
исполнување на предxодно зададен ред, исто така треба да се
оделуват во различни тригери.
14
• Mоже да се создаде еден тригер, кој да се исполнува при секое дејствие
оделно или при кое и да е исполнување на INSERT, UPDATE и DELETE.
Tригерот се исполнува по еден пат за секоја конструкција INSERT,
UPDATE или DELETE независно од бројот на редови, кој ги засегнува (0,
1 или повече). За да се избегне исполнување на код, кој е без смисла, често
пати првата конструкција во тригерот проверува колку реда се засегнати,
при користење на ]ункцијата ¸¸ROWCOUNT.
• Oпшт вид на конструкцијата за создавање на тригер:
CREATE TRIGGER trigger_name
ON table_name
FOR |DELETE||,||INSERT||,||UPDATE|
AS
sql_queries
15
• Тригерот се стартира, откако конструкцијата за модиицира!е на "одатоци за#р$и со
ра%ота, но "ред таа ра%ота да се "от#рди #о %азата на "одатоци& 'ако конструкциите така и
секак#ите модиикации из#р$ени #о тригерите се третират како транзакција& (оради тоа
тригерот мо)е да ја "ре#рне на назад модиикацијата на "одатоците, кој се "оја#и*е "ри
стартира!ето&
• Тригерот има доста" до "р#и+ниот изг*ед и крајниот изг*ед на "одатоците "реку
с"еција*ните "се#до та%е*и inserted и deleted& Тие д#е та%е*и имат ист з%ир на ко*они како
и осно#ната та%е*а, над која се из#р$у#аат "ромени и имат то*ку редо#и ко*ку се засегнати
од соод#етната конструкција за #несу#а!е, %ри$е!е и*и "ромена на "одатоците&
▫ Та%е*ата inserted содр)и редо#и, над кој е #*ијае*а модиикацијата, т&е& #несени и*и "роменети
и "ри тоа е до%иен ни#ниот краен изг*ед&
▫ Та%е*ата deleted содр)и редо#и, кој се засегнати од соод#етната конструкција за "ромена и*и
%ри$е!е и "ри тоа го содр)ат ни#ниот "р#и+ен изг*ед&
16
&абрана на тригери се извршува со следната конструкција:
ALTER TABLE table_name
DISABLE TRIGGER ¦ALL , trigger_name |,.|}

'азре$ување на тригери се извршува со аналогна
конструкција плус опцијата ENABLE.

#ри$ење на тригер се извршува со следната команда:
DROP TRIGGER trigger_name

Промена на тригер се изв¡ршва со следната конструкција:
ALTER TRIGGER trigger_name
ON table_name
FOR |DELETE||,||INSERT||,||UPDATE|
AS
sql_queries
17
(аскадни и рекурсивни тригери
• Aко тригерот моди]ицира податоци во некоја друга табела и таа има
тригер, тоа дали тој тригер xе биде стартиран зависи од
моменталната вредност на sp¸conIigure за опцијата nested triggers.
Aко таа опција е зададена на 1 (EXEC sp¸conIigure 'nested triggers', 1),
која е и вредност по подразбирање, тригерите можат да се извикат
каскадно до максимална редослед од 32.
• Aко тригерот моди]ицира податоци во иста табела, во која тој
постои, користењето на истата операција (INSERT, UPDATE или
DELETE) по подразбирање нема да стартира тригер одново. Tоа
поведение може да се промени дозволувајки тригерите да бидат
рекурсивни. Oва се контролира за конкретна база на податоци преку
задавање на опцијата recursive triggers на вредност TRUE (EXEC
sp¸dboption 'database_name', 'recursive triggers', TRUE). По
подразбирање вредноста на опцијата е FALSE.
18
(ористење на тригери за )ување на %елост на подато%ите
Стандардот SQL92 ги дава следните ре]еренциални дејствија за моди]ицирање
на страната на ограничувањето примарен клуч:
• *+ ,-./+* забранува дејствието, ако биде нарушено ограничувањето
FOREIGN KEY. Tоа е единственото ре]еренциално дејствие, реализирано од
SQL Server 7.0 за декларациски ограничувања FOREIGN KEY.
• 01. *233 ја обновува табела која се ре]ерира така што, колоните на
надворешниот клуч да станат со вредност NULL (кое бара колоните да се
де]инирани да дозволуват вредност NULL).
• 01. 415,23. ја обновува табела која се ре]ерира така, што колоните на
надворешниот клуч да добијат DEFAULT вредности (бара се колоните да
имат де]инирана вредност по подразбирање).
• -,0-,41 ја обновува ре]ерираната табела така, што колоните на
надворешниот клуч да ги добијат истите вредности, како и вредностите кој
се добиени при промена на примарниот клуч, или ги брише редовите кој се
ре]ерираат, ако примарниот клуч е избришан.
19
• Hајдобар начин за изполнување на NO ACTION е преку декларирање на ограничувањето
FOREIGN KEY, а не преку тригер. За изполнување на останатите ре]еренциални
дејствија треба да се искористи тригер (при верзија 7.0 на SQL Server).
• Проверка за нарушување на ограничувањата се прават пред активирање на тригерите.
Aко биде откриено нарушување на ограничувањето, конструкцијата се прекинува и не се
извршува изполнување на тригерот, т.е. тој не се активира. За по-добра прегледност може
да се декларира ограничување FOREIGN KEY во конструкциите со CREATE TABLE, а
после тоа забрани ограничувањето надворешен клуч со следната конструкција:
ALTER TABLE table_name
NOCHECK CONSTRAINT ¦ALL , constraint_name |,.|}
• Hа тој начин се гарантира, дека ограничувањето xе се гледа при исполнување на sp¸help
table_name, во дијаграми и други процедури.
20
Тригери за табела ко6а ре7ерира
1) Забрана на додавање и ажурирање, ако надворешниот клуч во табелата која ре]ерира
нема поклопување на вредностите на примарниот клуч во ре]ерираната табела:
CREATE TRIGGER SaleHasCustomer
ON Sales
FOR INSERT, UPDATE
AS
IF ¸¸ROWCOUNT ÷ 0 RETURN
IF EXISTS
( SELECT *
FROM Inserted i
LEFT JOIN Customers c ON i.CustomerID ÷ c.CustomerID
WHERE c.CustomerID IS NULL )
BEGIN
RAISERROR('Продажбата треба да има валиден CustomerID.', 16, 1)
ROLLBACK TRANSACTION
END
GO
21

За да се стартира тригерот , треба да се избрише или
забрани постоечко ограничување FOREIGN KEY за
табелата Sales на следниот начин:
ALTER TABLE Sales
NOCHECK CONSTRAINT FK¸Sale¸Customer
---------------------------------------------------------------
INSERT INTO Sales (CustomerID, EmployeeID,
SaleDate,TotalForSale)
VALUES (45, 88, 2009-05-04, 3)
22
Со IF UPDATE(column¸name) може да се зададе исполнување на определени дејствија во
тригерот, ако промените се одразиле на точно определени колони:
ALTER TRIGGER SaleHasCustomer
ON Sales
FOR INSERT, UPDATE
AS
IF ¸¸ROWCOUNT ÷ 0 RETURN
IF UPDATE (CustomerID)
IF EXISTS
( SELECT * FROM Inserted i
LEFT JOIN Customers c ON i.CustomerID ÷ c.CustomerID
WHERE c.CustomerID IS NULL )
BEGIN
RAISERROR('Продажбата трxбва да има валиден CustomerID.', 16, 1)
ROLLBACK TRANSACTION
END
GO
23
Тригери за ре7ерираната табела
2) Забрана на бришење на ред од ре]ерираната табела, ако тој има соодветни редови во табелата која
ре]ерира:
CREATE TRIGGER CustomerHasSales
ON Customers
FOR DELETE
AS
IF ¸¸ROWCOUNT ÷ 0 RETURN
IF EXISTS
( SELECT *
FROM Deleted d
INNER JOIN Sales s ON d.CustomerID ÷ s.CustomerID )
BEGIN
RAISERROR(Клиентот има извршени пазарувања.
Бришењето не е исполнето!', 16, 1)
ROLLBACK TRANSACTION
END
------------------------------------------------------------------------------
DELETE FROM Customers
WHERE CustomerID ÷ 3
24
3) Бришење на ред во ре]ерираната табела xе доведе до каскадно бришење на сите
редови во табелата која ре]ерира:
CREATE TRIGGER DelCascadeCustomer
ON Customers
FOR DELETE
AS
IF ¸¸ROWCOUNT ÷ 0 RETURN
DECLARE ¸count int
DELETE FROM Sales
FROM Sales s
INNER JOIN deleted d ON s.CustomerID ÷ d.CustomerID
SET ¸count ÷ ¸¸ROWCOUNT
IF ¸count ~ 0
RAISERROR('°d редот од Sales е избришан при што резултатот од бришење во
табелата Customers.', 11, 1, ¸count)
25
DELETE FROM Customers
WHERE CustomerID ÷ 3
При извршување на упитот треба претxодно да се
избрише тригерот CustomerHasSales
26
4) •еализација на SET DEFAULT ако биде променен некој примарен клуч во ре]ерираната табела, обновување
на колоните на надворешниот клуч во табелата која ре]ерира според вредностите по подразбирање :
CREATE TRIGGER UpdateDeIault¸Cust
ON Customers
FOR UPDATE
AS
IF ¸¸ROWCOUNT ÷ 0 RETURN
DECLARE ¸count int
IF UPDATE ( CustomerID )
BEGIN
UPDATE Sales
SET CustomerID ÷ DEFAULT
FROM Sales s
INNER JOIN deleted d ON s.CustomerID ÷ d.CustomerID
SET ¸count ÷ ¸¸ROWCOUNT
IF ¸count ~ 0
RAISERROR('Hа °d редот во Sales е зададена вредност по подразбирање на CustomerID така што
резултат од промената во табелата
Customers.', 11, 1, ¸count)
END
Oвој тригер лесно може да се промени така, да колоната која присвојува вредност NULL наместо DEFAULT да
реализира SET NULL
27
5) Каскадно обновување во ре]ерираната табела, т.е. обновува сите редови во табелата
која ре]ерира со соодветните вредности за надворешен клуч:
CREATE TRIGGER UpdateCascadeCustomers
ON Customers
FOR UPDATE
AS
DECLARE ¸num¸aIIected int, ¸customerID int,
¸old¸customerID int
SET ¸num¸aIIected ÷ ¸¸ROWCOUNT
IF ¸num¸aIIected ÷ 0 RETURN
IF UPDATE ( CustomerID )
BEGIN
IF ¸num¸aIIected ÷ 1
BEGIN
SELECT ¸customerID ÷ CustomerID
FROM inserted
SELECT ¸old¸customerID ÷ CustomerID
FROM deleted
UPDATE Sales
SET CustomerID ÷ ¸CustomerID
WHERE CustomerID ÷ ¸old¸customerID
SET ¸num¸aIIected ÷ ¸¸ROWCOUNT
28
RAISERROR('Каскадното ажурирање во Customers на примарниот клуч од °d на °d на °d
редот во Sales.', 11, 1,¸old¸customerID, ¸customerID, ¸num¸aIIected)
END
ELSE
BEGIN
RAISERROR('Hе може да се променат множество вредности на примарниот клуч во
една конструкција, поради постоење на каскадно
тригер кој се ажурира.', 16, 1)
ROLLBACK TRANSACTION
END
END
• По де]иниција при каскадното обновување се променува соодветниот примарен клуч кое
значи, дека каскадното обновување работи само ако се обновува еден-единствен ред во
ре]ерираната табела. Aко во една конструкција за обновување се променат множество
вредности на примарниот клуч, xе се изгуби можноста да се асоциират правилно кон табелата
која ре]ерира. Bо разгледаниот тригер е забрането обновување на примарниот клуч да
дејствува на повеxе од еден ред преку проверка на вредноста на ]ункцијата ¸¸ROWCOUNT.
Hе се препорачува да се прави масовно обновување на примарниот клуч.
29
&ада)а 1. ¡а се создаде тригер, кој забранува продажбата на продукти, определени во табелата
Products како продукти со прекината продажба.
'е$ение:
CREATE TRIGGER SaleDetailNotDiscontinued
ON SaleDetails
FOR INSERT, UPDATE
AS
IF ¸¸ROWCOUNT ÷ 0 RETURN
IF UPDATE ( ProductID )
BEGIN
IF EXISTS
( SELECT *
FROM Inserted i
INNER JOIN Products p ON i.ProductID ÷ p.ProductID
WHERE p.Discontinued ÷ 1 )
BEGIN
RAISERROR('Продуктот е прекинат со продажба.', 16, 1)
ROLLBACK TRANSACTION
END
END
30

Содржина
• Создавање на погледи • Промена на погледи • Бришење на погледи • Промена на податоци преку погледи • Создавање на тригер • Забрана, разрешување, промена и бришење на тригер • Каскадни и рекурсивни тригери • Користење на тригери за исполнување на дејствија за зачувување на целост на податоците • Тригери за табела која реферира • Тригери за реферираната табела • Задача

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->