
- •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
ProblemForExamSqlQuery17.Sql - Test
-- ********************************************************************************
-- Создаем демонстрационную базу данных с тремя DML-триггерами двумя DDL-триггерами
-- ********************************************************************************
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
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
IF EXISTS (SELECT * FROM sys.triggers WHERE parent_class = 0 AND name = 'trigger_table')
DROP TRIGGER trigger_table ON DATABASE
GO
CREATE TRIGGER trigger_table ON DATABASE FOR DROP_TABLE, ALTER_TABLE
AS
PRINT 'You must disable "trigger_table" to drop or alter tables!'
ROLLBACK;
GO
IF EXISTS (SELECT * FROM sys.triggers WHERE parent_class = 0 AND name = 'trigger_index')
DROP TRIGGER trigger_index ON DATABASE
GO
CREATE TRIGGER trigger_index ON DATABASE FOR DROP_INDEX, ALTER_INDEX
AS
PRINT 'You must disable "trigger_index" to drop or alter indexes!'
ROLLBACK;
GO
ProblemForExamSqlQuery17.Sql - Solution
-- ********************************************************************************
-- Создаем хранимую процедуру удаления всех SQL DML триггеров
-- ********************************************************************************
IF OBJECT_ID('dbo.drop_all_SQL_DDL_triggers', 'P') IS NOT NULL
DROP PROCEDURE dbo.drop_all_SQL_DDL_triggers
GO
CREATE PROCEDURE drop_all_SQL_DDL_triggers @cnt int OUTPUT
AS
BEGIN
DECLARE @trigger_name nvarchar(255), @SqlString nvarchar(1000)
SET @cnt = 0
IF NOT EXISTS (SELECT * FROM sys.triggers WHERE parent_class = 0)
RETURN
DECLARE trigger_list CURSOR FORWARD_ONLY STATIC FOR
SELECT name FROM sys.triggers WHERE parent_class = 0
OPEN trigger_list
FETCH NEXT FROM trigger_list into @trigger_name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @cnt = @cnt+1
SET @SqlString = N'DROP TRIGGER '+@trigger_name+N' ON DATABASE';
EXEC (@SqlString)
FETCH NEXT FROM trigger_list into @trigger_name
END
CLOSE trigger_list
DEALLOCATE trigger_list
END
GO
-- ********************************************************************************
-- Проверяем хранимую процедуру удаления всех SQL DDL триггеров
-- ********************************************************************************
SELECT * FROM sys.triggers
GO
DECLARE @cnt int
EXEC drop_all_SQL_DDL_triggers @cnt OUTPUT
SELECT @cnt
EXEC drop_all_SQL_DDL_triggers @cnt OUTPUT
SELECT @cnt
GO
SELECT * FROM sys.triggers
GO
Вариант 18
Создать и протестировать скалярную функцию на T-SQL, которая в строке, задаваемой параметром функции, через каждый символ вставляет символ-разделитель, задаваемый параметром функции.
create function Var18(@str varchar(1000), @ch char)
returns varchar(4000)
as
begin
declare @i int, @str2 varchar(max)
SET @i=1
SET @str2=N''
WHILE @i<LEN(@str)+1 BEGIN
set @str2=@str2+SUBSTRING(@str,@i,1)+@ch
SET @i=@i+1
END
return @str2
end
go
Вариант 19
Создать и протестировать хранимую процедуру на T-SQL, которая удаляет все SQL пользовательские функции в текущей базе данных, имена которых начинаются с префикса 'udf_'. Выходной параметр возвращает количество удаленных функций.
(см. 16, 17)
Вариант 20
В таблицу Customers базы данных Northwind добавить столбец CreditLimit money NULL. Затем создать и протестировать SQL DML триггер AFTER на событие INSERT для таблицы Customers, который в случае добавления нескольких (более одной) строк в столбец CreditLimit заносится значение, являющееся функцией ID; в случае добавления одной строки – в столбец CreditLimit заносится фиксированное значение (1000).
-------------------------
(может быть не то)