
- •SqlQuery03.Sql – Solution
- •ProblemForExamSqlQuery04.Sql - Solution
- •Отредактировать! (вариант 23) ProblemForExamSqlQuery23.Sql - Solution
- •ProblemForExamSqlQuery09.Sql – Solution
- •ProblemForExamSqlQuery13.Sql - Solution
- •ProblemForExamSqlQuery16.Sql - Test
- •ProblemForExamSqlQuery16.Sql - Solution
- •ProblemForExamSqlQuery17.Sql - Test
- •ProblemForExamSqlQuery17.Sql - Solution
- •ProblemForExamSqlQuery20.Sql – Solution
- •Отредактировать! ProblemForExamSqlQuery23.Sql - Solution
- •ProblemForExamSqlQuery25.Sql – Solution
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)
----------------------------