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

ProblemForExamSqlQuery16.Sql - Test

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

-- Создаем демонстрационную базу данных с тремя триггерами AFTER

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

USE master

GO

-- Уничтожаем базу данных, если она существует

IF DB_ID (N'sample_db') IS NOT NULL DROP DATABASE sample_db

GO

-- Создаем базу данных

CREATE DATABASE sample_db

GO

USE sample_db

GO

-- Уничтожаем таблицу, если она существует

IF OBJECT_ID('dbo.sample_table', 'U') IS NOT NULL DROP TABLE dbo.sample_table

GO

-- Создаем таблицу

CREATE TABLE dbo.sample_table

(

c1 int NOT NULL IDENTITY(1,1),

c2 char(10) NULL,

c3 datetime NULL

CONSTRAINT PK_sample_table PRIMARY KEY (c1)

)

GO

-- Заполняем таблицу даннными

INSERT INTO dbo.sample_table (c2, c3)

VALUES ('qwe', GETDATE()), ('asd', GETDATE()), ('zxc', GETDATE())

GO

-- Проверяем заполнение таблицы

SELECT * FROM dbo.sample_table

GO

-- Создаем три триггера, предварительно уничтожая их, если они естьIF OBJECT_ID('dbo.insert_trigger', 'TR') IS NOT NULL DROP TRIGGER dbo.insert_trigger

GO

CREATE TRIGGER dbo.insert_trigger ON dbo.sample_table AFTER INSERT

AS

PRINT 'INSERT TRIGGER'

GO

IF OBJECT_ID('dbo.update_trigger','TR') IS NOT NULL DROP TRIGGER dbo.update_trigger

GO

CREATE TRIGGER dbo.update_trigger ON dbo.sample_table AFTER UPDATE

AS

PRINT 'UPDATE TRIGGER'

GO

IF OBJECT_ID('dbo.delete_trigger','TR') IS NOT NULL DROP TRIGGER dbo.delete_trigger

GO

CREATE TRIGGER dbo.delete_trigger ON dbo.sample_table AFTER DELETE

AS

PRINT 'DELETE TRIGGER'

GO

ProblemForExamSqlQuery16.Sql - Solution

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

-- Создаем хранимую процедуру удаления всех SQL DML триггеров

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

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

DROP PROCEDURE dbo.drop_all_SQL_DML_triggers

GO

CREATE PROCEDURE drop_all_SQL_DML_triggers @cnt int OUTPUT

AS

BEGIN

DECLARE @trigger_name nvarchar(255), @SqlString nvarchar(1000)

SET @cnt = 0

DECLARE trigger_list CURSOR FORWARD_ONLY STATIC FOR

SELECT name FROM sys.objects WHERE type = 'TR'

OPEN trigger_list

FETCH NEXT FROM trigger_list into @trigger_name

WHILE @@FETCH_STATUS = 0

BEGIN

SET @cnt = @cnt+1

SET @SqlString = N'IF OBJECT_ID(N''[dbo].['+@trigger_name+']'', ''TR'') IS NOT NULL DROP TRIGGER [dbo].['+@trigger_name+']'

EXEC (@SqlString)

FETCH NEXT FROM trigger_list into @trigger_name

END

CLOSE trigger_list

DEALLOCATE trigger_list

END

GO

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

-- Проверяем хранимую процедуру удаления всех SQL DML триггеров

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

DECLARE @cnt int

EXEC drop_all_SQL_DML_triggers @cnt OUTPUT

SELECT @cnt

EXEC drop_all_SQL_DML_triggers @cnt OUTPUT

SELECT @cnt

GO

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

Отредактировать! (вариант 17)

USE dbFAS

GO

IF OBJECT_ID ( N'drop_all_triggers' ) IS NOT NULL

DROP PROCEDURE drop_all_triggers

GO

CREATE PROCEDURE drop_all_triggers

AS

--DECLARE - При помощи этой инструкции можно объявлять переменные

--курсоров для использования в других инструкциях

DECLARE @sql NVARCHAR(MAX) = '';

DECLARE @name sysname;

DECLARE LILU CURSOR

FOR

SELECT name FROM sys.triggers;

OPEN LILU;

FETCH NEXT FROM LILU INTO @name;

WHILE (@@FETCH_STATUS=0)

BEGIN

SELECT @sql = 'DROP TRIGGER ' + @name + ' ON DATABASE; ';

EXEC (@SQL);

FETCH NEXT FROM LILU INTO @name;

END;

CLOSE LILU;

DEALLOCATE LILU;

EXEC drop_all_triggers;

CREATE TABLE t(id int)

Вариант 17

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

USE dbFAS

GO

CREATE TRIGGER [asd]

ON DATABASE

FOR CREATE_TABLE

AS

PRINT 'You must disable Trigger "ddl" to drop trigger!';

--ROLLBACK;

GO

USE dbFAS

GO

IF OBJECT_ID ( N'drop_all_triggers' ) IS NOT NULL

DROP PROCEDURE drop_all_triggers

GO

CREATE PROCEDURE drop_all_triggers

AS

--DECLARE - При помощи этой инструкции можно объявлять переменные

--курсоров для использования в других инструкциях

DECLARE @sql NVARCHAR(MAX) = '';

DECLARE @name sysname;

DECLARE LILU CURSOR

FOR

SELECT name FROM sys.triggers;

OPEN LILU;

FETCH NEXT FROM LILU INTO @name;

WHILE (@@FETCH_STATUS=0)

BEGIN

SELECT @sql = 'DROP TRIGGER ' + @name + ' ON DATABASE; ';

EXEC (@SQL);

FETCH NEXT FROM LILU INTO @name;

END;

CLOSE LILU;

DEALLOCATE LILU;

EXEC drop_all_triggers;

CREATE TABLE t(id int)

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

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