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

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).

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

(может быть не то)

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