Выполненные задания
2. В приложении реализовать не менее пяти запросов, включая (для демонстрации навыков работы)
a) Составной многотабличный запрос с параметром, включающий соединение таблиц и CASE-выражение;
b) Запрос, содержащий коррелированные и некоррелированные подзапросы в разделах SELECT, FROM и WHERE (в каждом хотя бы по одному);
SELECT katalog.name
FROM katalog
WHERE raspologenie = 'C:'
c) Многотабличный запрос, содержащий группировку записей, агрегативные функции и параметр, используемый в разделе HAVING;
-- Список тарифов, стоимость которых превышает 400 копеек
SELECT katalog.name id_tip FROM katalog,tip
GROUP BY id_tip, id_katalog,katalog.name
HAVING COUNT(id_katalog) =id_tip;
d) Запрос, содержащий предикат ANY, SOME или ALL;
SELECT katalog.name FROM katalog
WHERE id_katalog = ANY (SELECT id_katalog FROM soderganie);
4. В таблице (в соответствии с вариантом) предусмотреть поле, которое заполняется автоматически по срабатыванию триггера при добавлении, обновлении и удалении данных, иметь возможность продемонстрировать работу триггера при работе приложения. Триггера должны обрабатывать только те записи, которые были добавлены, изменены или удалены в ходе текущей операции (транзакции).
CREATE TRIGGER Triggerkatalog
ON katalog
INSTEAD OF DELETE
AS
BEGIN
DECLARE @katalogId int
SELECT @katalogId = id_katalog FROM deleted;
if @katalogId IN (SELECT id_katalog FROM katalog)
BEGIN
ROLLBACK
print('Удаляемый ПО используется, удаление невозможно')
END
END
5. Операции добавления, удаления и обновления реализовать в виде хранимых процедур (с параметрами) хотя бы для одной таблицы; для остальных допустимо использовать возможности связывания полей ввода в приложении с полями БД;
CREATE PROCEDURE updatekatalog (@updateId int, @updatekatalogId INT, @updatenameId NVARCHAR(50), @updateraspologenieId NVARCHAR(MAX), @updatedirId NVARCHAR(MAX), @updatefileId NVARCHAR(MAX), @updatetip NVARCHAR(MAX), @updatefam NVARCHAR(MAX), @updatevladelecId NVARCHAR(MAX))
AS
BEGIN
UPDATE katalog
SET id_katalog = @updatekatalogId, name = @updatenameId, raspologenie = @updateraspologenieId, dir = @updatedirId, [FILE] = @updatefileId, id_tip=@updatetip, id_vladelec = @updatevladelecId
WHERE id_katalog = @updateId;
END
6. Реализовать отдельную хранимую процедуру, состоящую из нескольких отдельных операций в виде единой транзакции, которая при определенных условиях может быть зафиксирована или откатана;
CREATE PROCEDURE soderg(@id_soderg INT, @dir nvarchar(50), @file nvarchar(50))
AS
BEGIN
BEGIN TRANSACTION
INSERT INTO soderganie(id_soderg, dir,[file]) VALUES(@id_soderg, @dir, @file);
IF @dir=@file
ROLLBACK
COMMIT TRANSACTION
END
7. В триггере или хранимой процедуре реализовать курсор на обновления отдельных данных;
CREATE PROCEDURE updatekatalog (@updateId int, @updatename nvarchar(50), @updateraspologenie NVARCHAR(50))
AS
BEGIN
DECLARE my_cursor CURSOR
FOR SELECT ID FROM Tariffs;
OPEN my_cursor
DECLARE @id INT;
FETCH NEXT FROM my_cursor INTO @id;
WHILE @@FETCH_STATUS = 0
BEGIN
IF @updateId = @id
UPDATE katalog
SET id_katalog = 0
,name = ''
,raspologenie = ''
WHERE id_katalog = @updateId;
FETCH NEXT FROM my_cursor INTO @id;
END
CLOSE my_cursor;
DEALLOCATE my_cursor;
END
8. Распределение прав пользователей: предусмотреть не менее двух пользователей с разным набором привилегий. Каждый набор привилегий оформить в виде роли.
CREATE LOGIN [Admin] WITH PASSWORD=N'''1234321123321',
DEFAULT_DATABASE=[test123], DEFAULT_LANGUAGE=[русский], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
EXEC sys.sp_addsrvrolemember @loginame = N'Admin', @rolename = N'sysadmin'
GO
ALTER LOGIN [Admin] DISABLE
GO
CREATE LOGIN [USER] WITH PASSWORD=N'123456',
DEFAULT_DATABASE=[test123], DEFAULT_LANGUAGE=[русский], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
ALTER LOGIN [User] DISABLE
GO
