Читайте также: |
|
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
--------------------
Дата добавления: 2015-02-16; просмотров: 59 | Поможем написать вашу работу | Нарушение авторских прав |