Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BD_Otveti_po_zadachi_SQL_2.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
77.36 Кб
Скачать

Базы данных. Задачи на модули SQL 2

Вариант 01

Создать и протестировать хранимую процедуру T-SQL, в которой для экземпляра SQL Server создаются резервные копии всех пользовательских баз данных. Имя файла резервной копии должно состоять из имени базы данных и даты создания резервной копии, разделенных символом нижнего подчеркивания. Дата создания резервной копии должна быть представлена в формате YYYYDDMM.

-------------------------------

Написать сценарий на T-SQL, в котором для экземпляра SQL Server создаются резервные копии всех пользовательских баз данных. Имя файла резервной копии должно состоять из имени базы данных и даты создания резервной копии, разделенных символом нижнего подчеркивания. Дата создания резервной копии должна быть представлена в формате YYYYDDMM. Созданный сценарий протестировать.

DECLARE @name VARCHAR(50) – имя базы данных

DECLARE @path VARCHAR(256) – путь к backup-файлу

DECLARE @fileName VARCHAR(256) – полная спецификация файла

DECLARE @fileDate VARCHAR(20) – часть имени backup-файла, содержащая дату его создания

SET @path = 'D:\Backup\'

SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112)

DECLARE db_cursor CURSOR FOR

SELECT name

FROM master.dbo.sysdatabases –- sys.databases

WHERE name NOT IN ('master','model','msdb','tempdb')

OPEN db_cursor

FETCH NEXT FROM db_cursor INTO @name

WHILE @@FETCH_STATUS = 0

BEGIN

SET @fileName = @path + @name + '_' + @fileDate + '.BAK'

BACKUP DATABASE @name TO DISK = @fileName

FETCH NEXT FROM db_cursor INTO @name

END

CLOSE db_cursor

DEALLOCATE db_cursor

Создать и протестировать хранимую процедуру T-SQL, в которой для экземпляра SQL Server создаются резервные копии всех пользовательских баз данных. Имя файла резервной копии должно состоять из имени базы данных и даты создания резервной копии, разделенных символом нижнего подчеркивания. Дата создания резервной копии должна быть представлена в формате YYYYDDMM.

Рекомендации

Для создания резервной копии базы данных воспользоваться инструкцией BACKUP DATABASE, имеющей следующий формат:

BACKUP DATABASE имя_базы_данных TO DISK = полная_спецификация_файла_резервной_копии

Имена баз данных экземпляра SQL Server можно извлечь из системного представления sys.databases.

CREATE PROCEDURE usp_01 @path VARCHAR(256)

AS

BEGIN

DECLARE @name VARCHAR(50) -- имя базы данных

DECLARE @fileName VARCHAR(256) -- полная спецификация файла

DECLARE @fileDate VARCHAR(20) -- часть имени backup-файла, содержащая дату его создания

SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112)

DECLARE db_cursor CURSOR FOR

SELECT name

FROM sys.databases

WHERE name NOT IN ('master','model','msdb','tempdb')

OPEN db_cursor

FETCH NEXT FROM db_cursor INTO @name

WHILE @@FETCH_STATUS = 0

BEGIN

SET @fileName = @path + @name + '_' + @fileDate + '.BAK'

BACKUP DATABASE @name TO DISK = @fileName

FETCH NEXT FROM db_cursor INTO @name

END

CLOSE db_cursor

DEALLOCATE db_cursor

END

GO

Условия тестирования

EXEC usp_01 @path = 'D:\BACKUP\'

GO

Вариант 02

Создать и протестировать хранимую процедуру на T-SQL, которая, не уничтожая текущую базу данных, уничтожает все таблицы в схеме 'dbo' , имена которых начинаются с префикса, указываемого параметром процедуры.

----------------------------

Создать и протестировать хранимую процедуру на T-SQL, которая, не уничтожая текущую базу данных, уничтожает все таблицы в схеме 'dbo', имена которых начинаются с префикса, указываемого параметром процедуры.

CREATE PROCEDURE usp_02 @param VARCHAR(150)

AS

BEGIN

DECLARE @tname VARCHAR(150)

DECLARE @strsql VARCHAR(300)

SELECT @tname = (SELECT TOP 1 [name] FROM sys.objects WHERE [type] = 'U' and [name] like @param+'%' ORDER BY [name])

WHILE @tname IS NOT NULL

BEGIN

SELECT @strsql = 'DROP TABLE [dbo].[' + RTRIM(@tname) + ']';

EXEC (@strsql);

PRINT 'Dropped Table : ' + @tname;

SELECT @tname = (SELECT TOP 1 [name] FROM sys.objects WHERE [type] = 'U' AND [name] LIKE @param+'%' AND [name] > @tname ORDER BY [name]);

END;

END;

GO

Условия тестирования

CREATE TABLE TableNameXXX (c1 int);

GO

CREATE TABLE TableNameYYY (c1 float);

GO

CREATE TABLE TableNameZZZ (c1 char(2));

GO

EXEC usp_02 @param='TableName';

GO

Результаты тестирования

Dropped Table : TableNameXXX

Dropped Table : TableNameYYY

Dropped Table : TableNameZZZ

-----------------

Напишите сценарий, который, не уничтожая базу данных, уничтожает все те таблицы базы данных, имена которых начинаются с фразы 'TableName'. Созданный сценарий протестировать.

USE demodb

GO

DECLARE @tname VARCHAR(150)

DECLARE @strsql VARCHAR(300)

SELECT @tname = (SELECT TOP 1 [name] FROM sys.objects WHERE [type] = 'U' and [name] like N'TableName%' ORDER BY [name])

WHILE @tname IS NOT NULL

BEGIN

SELECT @strsql = 'DROP TABLE [dbo].[' + RTRIM(@tname) + ']'

EXEC (@strsql)

PRINT 'Dropped Table : ' + @tname

SELECT @tname = (SELECT TOP 1 [name] FROM sys.objects WHERE [type] = 'U' AND [name] like N'TableName%' AND [name] > @tname ORDER BY [name])

GO

Условия тестирования

USE demodb

GO

CREATE TABLE TableNameXXX (c1 int)

GO

CREATE TABLE TableNameYYY (c1 float)

GO

CREATE TABLE TableNameZZZ (c1 char(2))

GO

Результаты тестирования

Dropped Table : TableNameXXX

Dropped Table : TableNameYYY

Dropped Table : TableNameZZZ

Вариант 03

В базе данных Northwind создать и протестировать многооператорную табличную функцию на T-SQL, которая для таблицы Employees возвращает таблицу служебных отношений, связанных с подчинением одних сотрудников, сотрудникам более высоких уровней. Возвращаемая таблица должна содержать ID сотрудника и уровень субординации.

--------------------

SqlQuery03.Sql – Solution

В базе данных Northwind создать и протестировать многооператорную табличную функцию на T-SQL, которая для таблицы Employees возвращает таблицу служебных отношений, связанных с подчинением одних сотрудников, сотрудникам более высоких уровней. Возвращаемая таблица должна содержать ID сотрудника и уровень субординации.

USE Northwind

GO

CREATE FUNCTION dbo.ufn_03(@root int)

RETURNS @Subs Table (empid int NOT NULL PRIMARY KEY, lvl int NOT NULL)

AS

BEGIN

DECLARE @lvl int = 0; -- Initialize level counter with 0

INSERT INTO @Subs(empid, lvl) -- Insert root node to @Subs

SELECT EmployeeID, @lvl FROM dbo.Employees WHERE EmployeeID = @root;

WHILE @@rowcount > 0 -- while previous level had rows

BEGIN

SET @lvl = @lvl + 1; -- Increment level counter

INSERT INTO @Subs(empid, lvl) -- Insert next level of subordinates to @Subs

SELECT C.EmployeeID, @lvl

FROM @Subs AS P /* P = Parent */ JOIN dbo.Employees AS C /* C = Child */

ON P.lvl = @lvl - 1 /* Filter parents from previous level */

AND C.ReportsTo = P.empid;

END

RETURN;

END

GO

Условия тестирования

SELECT empid, lvl FROM dbo.ufn_03(5)

GO

Результаты тестирования

5 0

6 1

7 1

9 1

Вариант 04

Создать и протестировать хранимую процедуру на T-SQL, которая для текущей базы данных выводит имена и описания типа модулей (хранимых процедур и скалярных пользовательских функции), в описаниях которых встречается строка, указываемая параметром процедуры.

-------------------

Написать хранимую процедуру с входным параметром, которая выводит имена и описания типа объектов (хранимых процедур и скалярных функций), в тексте которых на языке SQL встречается строка, задаваемая параметром процедуры. Созданную процедуру протестировать.

USE demodb

GO

IF OBJECT_ID('dbo.search_procedure', 'P') IS NOT NULL

DROP PROCEDURE dbo.search_procedure

GO

-- Создание хранимой процедуры

CREATE PROCEDURE dbo.search_procedure @search_text nvarchar(100)

AS

BEGIN

DECLARE @sql_string nvarchar(1000)

SET @sql_string =

'SELECT DISTINCT o.name AS [Имя объекта], o.type_desc AS [Описание типа объекта]

FROM sys.sql_modules m INNER JOIN sys.objects o ON m.object_id=o.object_id

WHERE m.definition LIKE ''%'+@search_text+'%'' AND (o.type=''P'' OR o.type=''FN'')'

EXEC ( @sql_string )

END

GO

-- Тестирование хранимой процедуры

EXEC dbo.search_procedure @search_text = N'XML'

-----------------

(скорее всего не то)

ProblemForExamSqlQuery04.Sql - Solution

USE Northwind

GO

-- **********************************************************************

-- Создаем функцию уровней подчинения без ограничения на уровень

-- **********************************************************************

CREATE FUNCTION dbo.Subordinates(@root int)

RETURNS @Subs Table (empid int NOT NULL PRIMARY KEY, lvl int NOT NULL)

AS

BEGIN

DECLARE @lvl int = 0; -- Initialize level counter with 0

INSERT INTO @Subs(empid, lvl) -- Insert root node to @Subs

SELECT EmployeeID, @lvl FROM dbo.Employees WHERE EmployeeID = @root;

WHILE @@rowcount > 0 -- while previous level had rows

BEGIN

SET @lvl = @lvl + 1; -- Increment level counter

INSERT INTO @Subs(empid, lvl) -- Insert next level of subordinates to @Subs

SELECT C.EmployeeID, @lvl

FROM @Subs AS P /* P = Parent */ JOIN dbo.Employees AS C /* C = Child */

ON P.lvl = @lvl - 1 /* Filter parents from previous level */

AND C.ReportsTo = P.empid;

END

RETURN;

END

GO

-- ************************************************************

-- Node ids of descendants of a given node

-- ************************************************************

SELECT empid, lvl FROM dbo.Subordinates(5)

GO

Вариант 05

Создать и протестировать скалярную функцию на T-SQL, которая для строки, указываемой параметром функции, возвращает строку, удаляя все однострочные комментарии T-SQL. При тестировании удалить все однострочные комментарии в процедурах, имена которых начинаются с префикса 'usp_'.

-------------------------------

Создать и протестировать скалярную функцию на T-SQL, которая для символьной строки, указываемой параметром функции, возвращает строку, удаляя все многострочные комментарии T-SQL. Протестировать функцию на примере процедур, имена которых начинаются с префикса 'usp_'.

-------------------

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]