Создание представлений (только для чтения):
CREATE VIEW V_Account AS
SELECT a.Full_Name, a.Id, a.Nick_Name FROM dbo.Account a;
CREATE VIEW V_Account_Type AS
SELECT a.Nick_Name, a.Full_Name, t.Name, t.[Description]
FROM dbo.Account a JOIN dbo.[Type] t ON a.Account_Type = t.Id;
CREATE VIEW V_Question_TestCase_Account AS
SELECT q.Id, q.Name as 'Question', q.Answers, q.Right_Answers, t.Name as 'Test_Name', a.Nick_Name as 'Creator_Nick', a.Full_Name as 'Creator_Name'
FROM dbo.Question q JOIN dbo.TestCase t ON q.Id_Test = t.Id JOIN dbo.Account a ON t.Id_Creator = a.Id;
CREATE VIEW V_Session_Account_TestCase AS
SELECT a.Full_Name, a.Nick_Name, s.Start_Time, s.Passed_Questions, t.Name
FROM dbo.[Session] s JOIN dbo.Account a ON s.Id_Account = a.Id JOIN dbo.TestCase t ON s.Id_Test = t.Id;
Изменение полей в представлениях:
-- RENAME A TEACHER INTO ENGLISH VERSION --
SELECT * FROM dbo.V_Account;
UPDATE dbo.V_Account SET Full_Name = 'Vasiliy Petrovich' WHERE Nick_Name LIKE 'p%';
SELECT * FROM dbo.V_Account;
-- RENAME TEACHER INTO COOL_GUY --
SELECT * FROM dbo.V_Account_Type;
UPDATE dbo.V_Account_Type SET Name = 'Cool_Guy' WHERE Name = 'Teacher';
SELECT * FROM dbo.V_Account_Type;
SELECT * FROM dbo.V_Question_TestCase_Account;
UPDATE dbo.V_Question_TestCase_Account SET Question = 'Виды баз данных:' WHERE Question = 'Виды БД:';
SELECT * FROM dbo.V_Question_TestCase_Account;
SELECT * FROM dbo.V_Session_Account_TestCase;
UPDATE dbo.V_Session_Account_TestCase SET Start_Time = DATEADD(MINUTE, 50, Start_Time) WHERE Start_Time = '2012-02-16 21:46:15.000';
SELECT * FROM dbo.V_Session_Account_TestCase;
Попытка выполнения операций вставки и удаления с представлениями "только для чтения":
|
|
CREATE VIEW V_Account_Type_Full AS
SELECT a.*, t.Id as 'type_id', t.Name, t.Rights, t.[Description] FROM dbo.Account a JOIN dbo.[Type] t ON a.Account_Type = t.Id;
-- TRY TO INSERT AND DELETE --
SELECT * FROM dbo.V_Account_Type_Full;
INSERT INTO dbo.V_Account_Type_Full VALUES ('looper', 'Jack Sparrow', 2, 'strange student', 2, 'Student', 1, 'Can only pass tests');
DELETE FROM dbo.V_Account_Type_Full WHERE Nick_Name = 'student';
SELECT * FROM dbo.V_Account_Type_Full;
Скрипты работы с модифицируемыми представлениями:
-- Modifiable VIEW --
CREATE VIEW V_Session_n_NULLS AS
SELECT s.Id, s.Id_Account, s.Id_Test, s.Start_Time FROM dbo.[Session] s;
SELECT * FROM dbo.V_Session_n_NULLS;
DELETE TOP(1) FROM dbo.V_Session_n_NULLS WHERE Id_Account = '5' AND Id_Test = '2';
SELECT * FROM dbo.V_Session_n_NULLS;
INSERT INTO dbo.V_Session_n_NULLS VALUES (5, 2, '2014-02-23 15:30');
SELECT * FROM dbo.V_Session_n_NULLS;
-- TRY TO INSERT VALUES INTO VIEW --
-- BUT ONE OF THEM WON'T BE SHOWN --
CREATE VIEW V_TestCase_Partial AS
SELECT t.* FROM dbo.TestCase t WHERE t.Questions_Amount > 1;
SELECT * FROM dbo.TestCase;
SELECT * FROM dbo.V_TestCase_Partial;
INSERT INTO dbo.V_TestCase_Partial VALUES ('ОБД-2', 'Вторая часть курса. ADO.NET', 4, '2015-12-30 00:00:000', '00:10:00', 5);
INSERT INTO dbo.V_TestCase_Partial VALUES ('ОБД-3', 'Третья часть курса', 4, '2020-12-30 00:00:000', '00:30:00', 1);
SELECT * FROM dbo.V_TestCase_Partial;
SELECT * FROM dbo.TestCase;
-- Modifiable!!! VIEWS!!! --
CREATE VIEW V_Session_Partial AS
SELECT s.Id, s.Id_Account, s.Id_Test, s.Start_Time, s.Passed_Questions FROM dbo.[Session] s;
CREATE VIEW V_Session_Partial2 AS
SELECT s.Id, s.Id_Account, s.Id_Test, s.Start_Time FROM dbo.V_Session_Partial s;
SELECT * FROM dbo.V_Session_Partial;
SELECT * FROM dbo.V_Session_Partial2;
DELETE TOP(1) FROM dbo.V_Session_n_NULLS WHERE Id_Account = '5' AND Id_Test = '2';
SELECT * FROM dbo.V_Session_Partial2;
INSERT INTO dbo.V_Session_Partial2 VALUES (5, 2, '2014-02-23 15:30');
SELECT * FROM dbo.V_Session_Partial2;
Выводы
В результате выполнения лабораторной работы были написаны сценарии, производящие ряд различных запросов к представлениям.
Существует несколько серьезных нюансов при работе с представлениями. Самый главный из них - в сценарии создания должна присутствовать только одна команда CREATE VIEW и ничего более. Запрещается даже использовать команду USE.
|
|
Представления делятся на модифицируемые и "только для чтения". Проблема в том, что этот параметр задается неявно. Поэтому следует всегда проверять можно ли вставить в представление данные или нет. Также нужно понимать, что изменение значения можно производить и в таблице "только для чтения". Поэтому UPDATE работает для всех типов представлений.
Помимо этого в запрещены агрегатные функции и константы.