
- •ProblemForExamSqlQuery17.Sql - Test
- •ProblemForExamSqlQuery17.Sql - Solution
- •ProblemForExamSqlQuery16.Sql - Test
- •ProblemForExamSqlQuery16.Sql - Solution
- •ProblemForExamSqlQuery19.Sql - Test
- •ProblemForExamSqlQuery19.Sql – Solution
- •ProblemForExamSqlQuery25.Sql – Solution
- •Для создания резервной копии базы данных воспользоваться инструкцией backup database, имеющей следующий формат:
- •Имена баз данных экземпляра sql Server можно извлечь из системного представления sys.Databases.
ProblemForExamSqlQuery25.Sql – Solution
USE demodb
GO
IF OBJECT_ID (N'dbo.DROP_VIEWS', N'P') IS NOT NULL
DROP PROCEDURE dbo.DROP_VIEWS;
GO
-- ****************************************************************************************
-- Хранимая процедура удаления всех представлений в схеме 'dbo', не начинающихся с 'vw_'
-- ****************************************************************************************
CREATE PROCEDURE dbo.DROP_VIEWS @cnt int OUTPUT
AS
BEGIN
DECLARE @view_name nvarchar(128), @SQLString nvarchar(1000);
SET @cnt = 0;
IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE type='V'
AND SCHEMA_NAME(schema_id) = 'dbo')
RETURN;
DECLARE view_list CURSOR FORWARD_ONLY STATIC FOR
SELECT name FROM sys.objects WHERE type = 'V'
AND SCHEMA_NAME(schema_id) = 'dbo'
AND name NOT LIKE 'vw_%';
OPEN view_list
FETCH NEXT FROM view_list INTO @view_name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @cnt = @cnt+1;
SET @SQLString = N'IF OBJECT_ID(N''[dbo].['+@view_name+']'', ''V'') IS NOT NULL
DROP VIEW [dbo].['+@view_name+'];'
EXEC ( @SQLString );
FETCH NEXT FROM view_list INTO @view_name;
END
CLOSE view_list;
DEALLOCATE view_list;
END
GO
-- *******************************************************************************
-- Тестирование процедуры удаления представлений
-- *******************************************************************************
CREATE VIEW dbo.vw_1
AS
SELECT 'Hello world!' AS [Hello world!]
GO
CREATE VIEW dbo.vv_2
AS
SELECT 'Test' AS [Test]
GO
CREATE VIEW dbo.vv_3
AS
SELECT 'No' AS [No]
GO
DECLARE @cnt int
EXEC dbo.DROP_VIEWS @cnt OUTPUT
SELECT @cnt AS Number
GO
Вариант 15
Создать хранимую процедуру с параметром, в которой для экземпляра SQL Server создаются резервные копии всех пользовательских баз данных, созданных или переименованных после даты, указанной в параметре процедуры. Имя файла резервной копии должно состоять из имени базы данных и даты создания резервной копии, разделенных символом нижнего подчеркивания. Дата создания резервной копии должна быть представлена в формате YYYYDDMM. Созданную хранимую процедуру протестировать.
Рекомендации.
Для создания резервной копии базы данных воспользоваться инструкцией backup database, имеющей следующий формат:
BACKUP DATABASE имя_базы_данных TO DISK = полная_спецификация_файла_резервной_копии
Имена баз данных экземпляра sql Server можно извлечь из системного представления sys.Databases.
------------------
Нужно отредактировать! (вариант 1)
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
Вариант 16
Создать хранимую процедуру с входным параметром – имя таблицы, которая выводит сведения об индексах указанной таблицы в текущей базе данных. Созданную хранимую процедуру протестировать.
Рекомендации.
Сведения об индексах указанной таблицы в указанной базе данных можно получить с помощью динамической административной функции sys.dm_db_index_physical_stats, принимающей пять параметров:
Идентификатор базы данных - можно получить с помощью функции метаданных DB_ID.
Идентификатор таблицы - можно получить с помощью функции метаданных OBJECT_ID.
Для прочих параметров можно указать значения NULL.
Если имя таблицы задано неверно, напечатать сообщение 'Invalid table'.
IF OBJECT_ID ( 'dbo.Metadata', 'P' ) IS NOT NULL
DROP PROCEDURE dbo.Metadata
GO
CREATE PROCEDURE dbo.Metadata
@nametable varchar(10)
AS
if(OBJECT_ID(@nametable)is null)
print 'Invalid table!'
else
begin
SELECT sm.object_id AS TableID, OBJECT_NAME(sm.object_id) AS TableName
FROM sys.dm_db_index_physical_stats(DB_ID() ,OBJECT_ID(@nametable), null, null, null) as sm
end;
GO
EXEC dbo.Metadata 'dbo.H'
GO
Вариант 17
Создать хранимую процедуру с входным параметром, которая выводит имена хранимых процедур, созданных с параметром WITH RECOMPILE, в тексте которых на языке SQL встречается строка, задаваемая параметром процедуры. Созданную хранимую процедуру протестировать.
Рекомендации.
Информацию об объектах базы данных можно извлечь из системного представления sys.objects.
Информацию о модулях базы данных можно извлечь из системного представления sys.sql_modules.
CREATE PROCEDURE MetadataWorker
@TextToCheck NVARCHAR(20)
WITH RECOMPILE
AS
SELECT sm.object_id AS ProcedureID, OBJECT_NAME(sm.object_id) AS ProcedureName
FROM sys.sql_modules AS sm
JOIN sys.objects AS o ON sm.object_id = o.object_id
WHERE sm.is_recompiled = 1 AND sm.definition LIKE '%' + @TextToCheck + '%'
GO
EXEC MetadataWorker 'SELECT sm.object_id'
GO
EXEC MetadataWorker 'SEasdasd'
GO
Вариант 18
Создать хранимую процедуру без параметров, которая перестраивает все индексы всех таблиц в текущей базе данных. Созданную хранимую процедуру протестировать.
Рекомендации.
Информацию о таблицах базы данных можно извлечь из системного представления sys.objects.
Для перестроения индексов для таблицы в указанной базе данных воспользоваться командой DBCC DBREINDEX.
Использовать значение коэффициента заполнения для индекса, указанное при создании индекса.
-------------------
/*
REBUILD_INDEX
Написать хранимую процедуру без параметров, которая перестраивает все индексы всех таблиц в схеме dbo в произвольной базе данных, например, Northwind. Для перестроения индексов для таблицы в указанной базе данных воспользолваться командой DBCC DBREINDEX. Использовать значение коэффициента заполнения для индекса, указанное при создании индекса.
*/
USE Northwind
GO
ALTER PROCEDURE REBUILD_INDEX
AS
BEGIN
DECLARE @tablename varchar(255), @tablename_header varchar(600), @sql varchar(600)
DECLARE tnames_cursor CURSOR FOR
SELECT 'tablename'=o.name
FROM sys.objects o WHERE o.type = 'U' AND o.principal_id IS NULL
OPEN tnames_cursor
FETCH NEXT FROM tnames_cursor INTO @tablename
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
SELECT @tablename_header = '*** Updating '+rtrim(upper(@tablename))+'('+convert(varchar, getdate(), 20) + ') ***'
PRINT @tablename_header
SELECT @sql = 'DBCC DBREINDEX("dbo.'+@tablename+'", '''',0)'
EXEC ( @sql )
END
FETCH NEXT FROM tnames_cursor INTO @tablename
END
PRINT '*** DBREINDEX have been updated for all tables (' + convert(varchar,getdate(),20) + ') ***'
CLOSE tnames_cursor
DEALLOCATE tnames_cursor
END
GO
-- Тестирование хранимой процедуры
USE Northwind
GO
EXEC REBUILD_INDEX
GO
Вариант 19
Создать хранимую процедуру без параметров, которая осуществляет поиск ключевого слова 'EXEC' в тексте хранимых процедур в текущей базе данных. Хранимая процедура выводит инструкцию 'EXEC', которая выполняет хранимую процедуру или скалярную пользовательскую функцию. Созданную хранимую процедуру протестировать.
Рекомендации.
Информацию об объектах базы данных можно извлечь из системного представления sys.objects.
Информацию о модулях базы данных можно извлечь из системного представления sys.sql_modules.
Для работы со строками воспользоваться следующими функциями:
CHARINDEX ( expression1 ,expression2 [ , start_location ] )
Выполняет поиск выражения expression1 в выражении expression2 и в случае обнаружения возвращает его начальную позицию. Поиск начинается с аргумента start_location.
SUBSTRING ( value_expression , start_expression , length_expression )
Возвращает фрагмент символьного, двоичного, текстового или графического выражения.
DATALENGTH ( expression )
Возвращает число байтов, использованных для представления выражения.
use iu7_51_stas;
go
CREATE procedure SeachInStored
as
select distinct Substring( sc.text,Charindex('exec',sc.text,1),Charindex(' ',sc.text,Charindex('exec',sc.text,1)+7)-Charindex('exec',sc.text,1))
from syscomments sc inner join sysobjects so on sc.id = so.id
where sc.text like '%exec%' and exists(
Select *
from sysobjects so1
where so1.name = Substring( sc.text,Charindex('exec',sc.text,1)+5,Charindex(' ',sc.text,Charindex('exec',sc.text,1)+7)-Charindex('exec',sc.text,1)-5)
)
GO
exec SeachInStored
Вариант 20
Создать хранимую процедуру с входным параметром – имя базы данных, которая выводит имена ограничений CHECK и выражения SQL, которыми определяются эти ограничения CHECK, в тексте которых на языке SQL встречается предикат 'LIKE'. Созданную хранимую процедуру протестировать.
Рекомендации.
Информацию об объектах базы данных можно извлечь из системного представления sys.objects.
Информацию об ограничениях CHECK можно извлечь из системного представления sys.check_constraints.
Если имя базы данных задано неверно, напечатать сообщение 'Invalid database'.
----------------------
(скорее всего не то)
USE tempdb
GO
IF OBJECT_ID ('dbo.GetInfoAboutIndexes', 'P') IS NOT NULL
DROP PROCEDURE dbo.GetInfoAboutIndexes;
GO
CREATE PROCEDURE dbo.GetInfoAboutIndexes (@dbname nvarchar(128))
AS
BEGIN
DECLARE @db_id int;
SET @db_id = DB_ID(@dbname); -- Возвращает идентификационный номер базы данных
IF @db_id IS NULL
BEGIN;
PRINT N'Invalid database';
RETURNCHECK
END;
DECLARE @command nvarchar(1000);
SET @command = N'USE ' + @dbname;
EXEC (@command);
SELECT
s.[name] AS SchemaName,
o.[name] AS TableName,
i.[name] AS IndexName,
f.[avg_fragmentation_in_percent] AS FragPercent,
f.fragment_count
FROM sys.dm_db_index_physical_stats(@db_id, NULL, NULL, NULL, DEFAULT) f -- Возвращает сведения о размере и фрагментации данных и индексов указанной таблицы или представления
JOIN sys.indexes i -- Содержит по одной строке для каждого индекса
ON f.[object_id] = i.[object_id] AND f.[index_id] = i.[index_id]
JOIN sys.objects o -- Содержит по одной строке для каждого определенного пользователем объекта в области схемы
ON i.[object_id] = o.[object_id]
JOIN sys.schemas s -- Содержит по одной строке для каждой схемы базы данных
ON o.[schema_id] = s.[schema_id]
WHERE o.[is_ms_shipped] = 0 AND i.[is_disabled] = 0 -- Объект пользовательский (0) и индекс не отключен (0).
END
GO
-- Тестирование созданной процедуры
EXEC dbo.GetInfoAboutIndexes N'Northwind'
GO