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

ProblemForExamSqlQuery13.Sql - Solution

USE demodb

GO

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

DROP PROCEDURE dbo.TranslateSimpleXml;

GO

CREATE PROCEDURE dbo.TranslateSimpleXml (@xml_file varchar(100))

AS

BEGIN

DECLARE @idoc int, @doc varchar(8000) = '', @xml_line varchar(200), @bulkinscmd varchar(500)

-- Insert XML file into temporary table

CREATE TABLE #tempXML (Line varchar(8000))

SET @bulkinscmd = 'BULK INSERT #tempXML FROM ''' + @xml_file + ''''

EXEC (@bulkinscmd)

SELECT * FROM #tempXML

DECLARE xml_cursor CURSOR FOR

SELECT * FROM #tempXML

-- Create XML string in SQL SERVER memory

OPEN xml_cursor

FETCH NEXT FROM xml_cursor INTO @xml_line

WHILE @@FETCH_STATUS = 0

BEGIN

SET @doc = @doc + RTRIM(LTRIM(@xml_line))

FETCH NEXT FROM xml_cursor INTO @xml_line

END

CLOSE xml_cursor

DEALLOCATE xml_cursor

DROP TABLE #tempXML

-- Create an internal representation of the XML document.

EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

SELECT text

FROM OPENXML (@idoc, '/ROOT/LINE', 1)

WHERE text is not null

EXEC sp_xml_removedocument @idoc

END

GO

EXEC TranslateSimpleXml 'd:\dict.xml'

GO

<ROOT>

<LINE>

<NAME>SUBJECT</NAME>

<VALUE>ELI SECTION</VALUE>

</LINE>

<LINE>

<NAME>THE PLANT</NAME>

<VALUE>IEC factory</VALUE>

</LINE>

<LINE>

<NAME>CREATE DATE</NAME>

<VALUE>01/07/2004</VALUE>

</LINE>

</ROOT>

text

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

SUBJECT

ELI SECTION

THE PLANT

IEC factory

CREATE DATE

01/07/2004

(6 rows affected)

Вариант 14

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

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

/*

Сценарий поиска потенциально опасных ключевых слов в хранимых процедурах. В данном случае таким ключевым словом является 'EXEC'.

Сценарий печатает инструкцию 'EXEC', которая выполняет командную строку — строку символов или один из следующих модулей: хранимую процедуру или скалярную пользовательскую функцию.

*/

USE Northwind

GO

DECLARE @i int, @j int, @current_proc varchar(255),@current_text varchar(8000)

DECLARE _Cursor CURSOR FOR

SELECT o.name, m.definition

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

WHERE o.type='P' AND m.definition IS NOT NULL

OPEN _Cursor

FETCH NEXT FROM _Cursor INTO @current_proc, @current_text

WHILE @@FETCH_STATUS = 0

BEGIN

SET @i=0

lblAgain: SET @i=CHARINDEX('EXEC', @current_text, @i)

SET @j=CHARINDEX(CHAR(13), @current_text, @i)-@i

IF @j<0

SET @j=DATALENGTH(@current_text)-@i+1

IF @i>0

BEGIN

PRINT @current_proc

PRINT ' '+SUBSTRING(@current_text, @i, @j)

SET @i=@i+1

GOTO lblAgain

END

FETCH NEXT FROM _Cursor INTO @current_proc, @current_text

END

CLOSE _Cursor

DEALLOCATE _Cursor

GO

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

(Горшков)

USE Lab_01

GO

CREATE PROCEDURE MetadataWorker

AS

DECLARE @exec_string varchar(40)

DECLARE [CURSOR] CURSOR

GLOBAL

FOR

SELECT SUBSTRING(sm.definition, CHARINDEX('EXEC',sm.definition, 0), 60)

FROM sys.sql_modules AS sm

JOIN sys.objects AS o ON sm.object_id = o.object_id

WHERE CHARINDEX('EXEC',sm.definition) <> 0 AND OBJECT_NAME(sm.object_id) <> 'MetadataWorker' AND o.type = 'P' AND SUBSTRING(sm.definition, CHARINDEX('EXEC',sm.definition, 0), 40)<>'';

OPEN [Cursor];

FETCH NEXT FROM [CURSOR] INTO @exec_string;

PRINT CONVERT(varchar, @exec_string);

CLOSE [Cursor];

DEALLOCATE [Cursor];

GO

EXEC MetadataWorker

GO

DROP procedure dbo.MetadataWorker

Вариант 15

В базе данных Northwind создать таблицу Orders_Audit типа таблицы Orders с одним дополнительным столбцом: DateAdded DATETIME NOT NULL DEFAULT GETDATE(). Затем создать и протестировать SQL DML триггер AFTER на событие UPDATE для таблицы Orders, который в случае обновления столбцов ShippedDate и/или RequiredDate добавляет старый образ строки в таблицу Orders_Audit.

-- это неправильно, кто доведёт до ума, скажите --

CREATE TRIGGER Var15

ON Orders

AFTER UPDATE

AS

IF ( UPDATE (ShippedDate) OR UPDATE (RequiredDate) )

BEGIN

insert into Orders_Audit (/* перечислить поля */)

values (

select *

from Orders

where deleted.ShippedDate <> Orders.ShippedDate

or deleted.RequiredDate <> Orders.RequiredDate

)

END;

GO

Вариант 16

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

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

(Антон)

CREATE PROC dbo.DropDMLTrigger @count INT OUTPUT

AS

DECLARE @t1 varchar(1000)

DECLARE @sqlstr varchar(4000)

DECLARE st SCROLL CURSOR FOR

SELECT s1 = ob.name FROM sys.objects AS ob WHERE OBJECTPROPERTY(ob.object_id, N'IsTrigger') = 1 AND ob.type = 'TR'

OPEN st

FETCH NEXT FROM st INTO @t1

WHILE @@FETCH_STATUS = 0

BEGIN

SELECT @sqlstr = 'DROP TRIGGER ' + @t1

EXEC (@sqlstr)

SET @count = @count + 1

FETCH NEXT FROM st INTO @t1

END

CLOSE st

DEALLOCATE st

GO

DECLARE @num INT = 0

EXEC dbo.DropDMLTrigger @num OUTPUT

SELECT @num

GO

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

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