Главная / Базы данных /
Программирование в Microsoft SQL Server 2000 / Тест 29
Программирование в Microsoft SQL Server 2000 - тест 29
Упражнение 1:
Номер 1
Триггеры характеризуются тем, что:
Ответ:
 (1) SQL Server быстрее выполняет их при работе с данными 
 (2) имеют более широкую синтаксическую форму по сравнению с хранимыми процедурами 
 (3) SQL Server автоматически вызывает их при обращении к команде, для которой они определены 
Номер 2
Триггеры характеризуются тем, что:
Ответ:
 (1) SQL Server быстрее выполняет их при работе с данными 
 (2) SQL Server автоматически вызывает их при обращении к команде, для которой они определены 
 (3) имеют более широкую синтаксическую форму по сравнению с хранимыми процедурами 
Номер 3
Триггеры характеризуются тем, что:
Ответ:
 (1) SQL Server автоматически вызывает их при обращении к команде, для которой они определены 
 (2) SQL Server быстрее выполняет их при работе с данными 
 (3) имеют более широкую синтаксическую форму по сравнению с хранимыми процедурами 
Упражнение 2:
Номер 1
Триггер AFTER
характеризуется тем, что:
Ответ:
 (1) вызываются вместо команды, которой он назначен 
 (2) инициализируется до команды, которой он назначен 
 (3) вызывается после выполнения команды, которой он назначен 
Номер 2
Триггер INSTEAD OF
характеризуется тем, что:
Ответ:
 (1) вызывается после выполнения команды, которой он назначен 
 (2) вызываются вместо команды, которой он назначен 
 (3) инициализируется вместе с командой, которой он назначен 
Номер 3
SQL Server 2000 накладывает ряд ограничений на действия, выполняемые триггерами:
Ответ:
 (1) нельзя создавать (командой CREATE
), изменять (командой ALTER
) или удалять (командой DROP
) базу данных с использованием триггера 
 (2) нельзя изменять структуру таблиц с использованием триггеров и хранимых процедур 
 (3) нельзя восстанавливать базу данных или файл журнала 
 (4) нельзя выполнять определенные операции, которые изменяют конфигурацию SQL Server 
 (5) запрещается совместное использование триггеров и хранимых процедур в одном сценарии 
Упражнение 3:
Номер 1
Синтаксис оператора CREATE TRIGGER
имеет вид:
Ответ:
 (1)
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
sql_statement [ ...n ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE] }
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask
[ ...n ]
} ]
sql_statement [ ...n ]
}
}
 
 (2)
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE] }
[ WITH APPEND ]
[ AS ]
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
} ]
sql_statement [ ...n ]
}
}
 
 (3)
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ ...n ]
} ]
sql_statement [ ...n ]
}
}
 
Номер 2
Синтаксис оператора CREATE TRIGGER
имеет вид:
Ответ:
 (1)
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
sql_statement [ ...n ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask
[ ...n ]
} ]
sql_statement [ ...n ]
}
}
 
 (2)
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ ...n ]
} ]
sql_statement [ ...n ]
}
}
 
 (3)
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ]
[ AS ]
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
} ]
sql_statement [ ...n ]
}
}
 
Номер 3
Синтаксис оператора CREATE TRIGGER
имеет вид:
Ответ:
 (1)
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ ...n ]
} ]
sql_statement [ ...n ]
}
}
 
 (2)
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
sql_statement [ ...n ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask
[ ...n ]
} ]
sql_statement [ ...n ]
}
}
 
 (3)
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ]
[ AS ]
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
} ]
sql_statement [ ...n ]
}
}
 
Упражнение 4:
Номер 1
Функция UPDATE
предназначена для:
Ответ:
 (1) определения, к какой операции предназначен триггер 
 (2) использования в триггере для определения, подвергалась ли изменению определенная строка 
 (3) использования в триггере для определения, подвергся ли изменению определенный столбец в строке 
Номер 2
Функция UPDATE
предназначена для:
Ответ:
 (1) определения, к какой операции предназначен триггер 
 (2) использования в триггере для определения, подвергся ли изменению определенный столбец в строке 
 (3) использования в триггере для определения, подвергалась ли изменению определенная строка 
Номер 3
Функция UPDATE
предназначена для:
Ответ:
 (1) использования в триггере для определения, подвергся ли изменению определенный столбец в строке 
 (2) использования в триггере для определения, подвергалась ли изменению определенная строка 
 (3) определения, к какой операции предназначен триггер 
Упражнение 5:
Номер 1
CREATE TRIGGER TrackCustomerUpdates
ON AppDta.dbo.Customer
FOR INSERT, UPDATE, DELETE
AS
DECLARE @InsertedCount INT
DECLARE @DeletedCount INT
SET @InsertedCount = ( SELECT COUNT (*) FROM INSERTED )
SET @DeletedCount = ( SELECT COUNT(*) FROM DELETED )
IF ( @InsertedCount > 0 ) BEGIN
INSERT INTO AppDta.dbo.CustUpdLog
( CustId, Action, UpdUser, UpdDateTime )
SELECT CustId,
CASE
WHEN ( @DeletedCount > 0 ) THEN 'Update'
ELSE 'Insert'
END,
CURRENT_USER, CURRENT_TIMESTAMP
FROM INSERTED
END
ELSE IF ( @DeletedCount > 0 ) BEGIN
INSERT INTO AppDta.dbo.CustUpdLog ( CustId, Action, UpdUser, UpdDateTime )
SELECT CustId, 'Delete', CURRENT_USER, CURRENT_TIMESTAMP
FROM DELETED
END
Данный сценарий выполняет действия:
Ответ:
 (1) временная таблица DELETED
содержит строки в том случае, когда инструкция INSERT
или UPDATE
обработала хотя бы одну строку. А временная таблица INSERTED
содержит строки в том случае, когда инструкция UPDATE
обработала ВСЕ строки. Для инструкции UPDATE
таблица DELETE
содержит обновленные строки со старыми значениями, а таблица DELETED
содержит те же строки с новыми значениями. В приведенном примере учтена еще одна особенность триггеров: триггеры операций DELETE
и UPDATE
вызываются даже в том случае, если операция не удалила или не обновила ни одной строки (потому что не нашлось строк, соответствующих условию WHERE
) 
 (2) временная таблица DELETED
содержит строки в том случае, когда инструкция INSERT
или UPDATE
обработала хотя бы одну строку. А временная таблица INSERTED
содержит строки в том случае, когда инструкция DELETE
или UPDATE
обработала хотя бы одну строку. Для инструкции UPDATE
таблица DELETE
содержит обновленные строки со старыми значениями, а таблица DELETED
содержит те же строки с новыми значениями. В приведенном примере учтена еще одна особенность триггеров: триггеры операций DELETE
и UPDATE
вызываются даже в том случае, если операция не удалила или не обновила ни одной строки (потому что не нашлось строк, соответствующих условию WHERE
) 
 (3) временная таблица INSERTED
содержит строки в том случае, когда инструкция INSERT
или UPDATE
обработала хотя бы одну строку. А временная таблица DELETED
содержит строки в том случае, когда инструкция DELETE
или UPDATE
обработала хотя бы одну строку. Для инструкции UPDATE
таблица DELETE
содержит обновленные строки со старыми значениями, а таблица INSERTED
содержит те же строки с новыми значениями. В приведенном примере учтена еще одна особенность триггеров: триггеры операций DELETE
и UPDATE
вызываются даже в том случае, если операция не удалила или не обновила ни одной строки (потому что не нашлось строк, соответствующих условию WHERE
) 
Номер 2
CREATE TRIGGER TrackCustomerUpdates
ON AppDta.dbo.Customer
FOR INSERT, UPDATE, DELETE
AS
DECLARE @InsertedCount INT
DECLARE @DeletedCount INT
SET @InsertedCount = ( SELECT COUNT (*) FROM INSERTED )
SET @DeletedCount = ( SELECT COUNT(*) FROM DELETED )
IF ( @InsertedCount > 0 ) BEGIN
INSERT INTO AppDta.dbo.CustUpdLog
( CustId, Action, UpdUser, UpdDateTime )
SELECT CustId,
CASE
WHEN ( @DeletedCount > 0 ) THEN 'Update'
ELSE 'Insert'
END,
CURRENT_USER, CURRENT_TIMESTAMP
FROM INSERTED
END
ELSE IF ( @DeletedCount > 0 ) BEGIN
INSERT INTO AppDta.dbo.CustUpdLog ( CustId, Action, UpdUser, UpdDateTime )
SELECT CustId, 'Delete', CURRENT_USER, CURRENT_TIMESTAMP
FROM DELETED
END
Данный сценарий выполняет действия:
Ответ:
 (1) временная таблица DELETED
содержит строки в том случае, когда инструкция INSERT
или UPDATE
обработала хотя бы одну строку. А временная таблица INSERTED
содержит строки в том случае, когда инструкция DELETE
или UPDATE
обработала хотя бы одну строку. Для инструкции UPDATE
таблица DELETE
содержит обновленные строки со старыми значениями, а таблица DELETED
содержит те же строки с новыми значениями. В приведенном примере учтена еще одна особенность триггеров: триггеры операций DELETE
и UPDATE
вызываются даже в том случае, если операция не удалила или не обновила ни одной строки (потому что не нашлось строк, соответствующих условию WHERE
) 
 (2) временная таблица INSERTED
содержит строки в том случае, когда инструкция INSERT
или UPDATE
обработала хотя бы одну строку. А временная таблица DELETED
содержит строки в том случае, когда инструкция DELETE
или UPDATE
обработала хотя бы одну строку. Для инструкции UPDATE
таблица DELETE
содержит обновленные строки со старыми значениями, а таблица INSERTED
содержит те же строки с новыми значениями. В приведенном примере учтена еще одна особенность триггеров: триггеры операций DELETE
и UPDATE
вызываются даже в том случае, если операция не удалила или не обновила ни одной строки (потому что не нашлось строк, соответствующих условию WHERE
) 
 (3) временная таблица DELETED
содержит строки в том случае, когда инструкция INSERT
или UPDATE
обработала хотя бы одну строку. А временная таблица INSERTED
содержит строки в том случае, когда инструкция UPDATE
обработала ВСЕ строки. Для инструкции UPDATE
таблица DELETE
содержит обновленные строки со старыми значениями, а таблица DELETED
содержит те же строки с новыми значениями. В приведенном примере учтена еще одна особенность триггеров: триггеры операций DELETE
и UPDATE
вызываются даже в том случае, если операция не удалила или не обновила ни одной строки (потому что не нашлось строк, соответствующих условию WHERE
) 
Номер 3
CREATE TRIGGER TrackCustomerUpdates
ON AppDta.dbo.Customer
FOR INSERT, UPDATE, DELETE
AS
DECLARE @InsertedCount INT
DECLARE @DeletedCount INT
SET @InsertedCount = ( SELECT COUNT (*) FROM INSERTED )
SET @DeletedCount = ( SELECT COUNT(*) FROM DELETED )
IF ( @InsertedCount > 0 ) BEGIN
INSERT INTO AppDta.dbo.CustUpdLog
( CustId, Action, UpdUser, UpdDateTime )
SELECT CustId,
CASE
WHEN ( @DeletedCount > 0 ) THEN 'Update'
ELSE 'Insert'
END,
CURRENT_USER, CURRENT_TIMESTAMP
FROM INSERTED
END
ELSE IF ( @DeletedCount > 0 ) BEGIN
INSERT INTO AppDta.dbo.CustUpdLog ( CustId, Action, UpdUser, UpdDateTime )
SELECT CustId, 'Delete', CURRENT_USER, CURRENT_TIMESTAMP
FROM DELETED
END
Данный сценарий выполняет действия:
Ответ:
 (1) временная таблица INSERTED
содержит строки в том случае, когда инструкция INSERT
или UPDATE
обработала хотя бы одну строку. А временная таблица DELETED
содержит строки в том случае, когда инструкция DELETE
или UPDATE
обработала хотя бы одну строку. Для инструкции UPDATE
таблица DELETE
содержит обновленные строки со старыми значениями, а таблица INSERTED
содержит те же строки с новыми значениями. В приведенном примере учтена еще одна особенность триггеров: триггеры операций DELETE
и UPDATE
вызываются даже в том случае, если операция не удалила или не обновила ни одной строки (потому что не нашлось строк, соответствующих условию WHERE
) 
 (2) временная таблица DELETED
содержит строки в том случае, когда инструкция INSERT
или UPDATE
обработала хотя бы одну строку. А временная таблица INSERTED
содержит строки в том случае, когда инструкция DELETE
или UPDATE
обработала хотя бы одну строку. Для инструкции UPDATE
таблица DELETE
содержит обновленные строки со старыми значениями, а таблица DELETED
содержит те же строки с новыми значениями. В приведенном примере учтена еще одна особенность триггеров: триггеры операций DELETE
и UPDATE
вызываются даже в том случае, если операция не удалила или не обновила ни одной строки (потому что не нашлось строк, соответствующих условию WHERE
) 
 (3) временная таблица DELETED
содержит строки в том случае, когда инструкция INSERT
или UPDATE
обработала хотя бы одну строку. А временная таблица INSERTED
содержит строки в том случае, когда инструкция UPDATE
обработала ВСЕ строки. Для инструкции UPDATE
таблица DELETE
содержит обновленные строки со старыми значениями, а таблица DELETED
содержит те же строки с новыми значениями. В приведенном примере учтена еще одна особенность триггеров: триггеры операций DELETE
и UPDATE
вызываются даже в том случае, если операция не удалила или не обновила ни одной строки (потому что не нашлось строк, соответствующих условию WHERE
) 
Упражнение 6:
Номер 1
CREATE TRIGGER TrackDiscountUpdates
ON AppDta.dbo.Customer
FOR UPDATE
AS
IF UPDATE( Discount )
INSERT INTO AppDta.dbo.CustUpdLog
( CustId, Action, Discount,
UpdUser, UpdDateTime )
SELECT CustId, 'Update', Discount, CURRENT_USER,
СURRENT_TIMESTAMP
FROM INSERTED
ENDIF
Данный сценарий выполняет действия:
Ответ:
 (1) с помощью проверки IF UPDATE
(имя столбца) проверяется, обновлен ли столбец Discount таблицы AppDta.dbo.CustUpdLog , и если да, то проводится выборка строк таблицы 
 (2) с помощью проверки IF UPDATE
(имя столбца) проверяется, обновлен ли столбец Discount таблицы AppDta.dbo.CustUpdLog , и если да, то проводится вставка строк в таблицу, посредством оператора SELECT
 
 (3) с помощью проверки IF UPDATE
(имя столбца) проверяется, обновлен ли столбец Discount таблицы AppDta.dbo.Customer, и если да, то проводится вставка строк в таблицу, посредством оператора SELECT
 
Номер 2
CREATE TRIGGER TrackDiscountUpdates
ON AppDta.dbo.Customer
FOR UPDATE
AS
IF UPDATE( Discount )
INSERT INTO AppDta.dbo.CustUpdLog
( CustId, Action, Discount,
UpdUser, UpdDateTime )
SELECT CustId, 'Update', Discount, CURRENT_USER,
СURRENT_TIMESTAMP
FROM INSERTED
ENDIF
Данный сценарий выполняет действия:
Ответ:
 (1) с помощью проверки IF UPDATE
(имя столбца) проверяется, обновлен ли столбец Discount таблицы AppDta.dbo.CustUpdLog , и если да, то проводится вставка строк в таблицу, посредством оператора SELECT
 
 (2) с помощью проверки IF UPDATE
(имя столбца) проверяется, обновлен ли столбец Discount таблицы AppDta.dbo.Customer, и если да, то проводится вставка строк в таблицу, посредством оператора SELECT
 
 (3) с помощью проверки IF UPDATE
(имя столбца) проверяется, обновлен ли столбец Discount таблицы AppDta.dbo.CustUpdLog , и если да, то проводится выборка строк таблицы 
Номер 3
CREATE TRIGGER TrackDiscountUpdates
ON AppDta.dbo.Customer
FOR UPDATE
AS
IF UPDATE( Discount )
INSERT INTO AppDta.dbo.CustUpdLog
( CustId, Action, Discount,
UpdUser, UpdDateTime )
SELECT CustId, 'Update', Discount, CURRENT_USER,
СURRENT_TIMESTAMP
FROM INSERTED
ENDIF
Данный сценарий выполняет действия:
Ответ:
 (1) с помощью проверки IF UPDATE
(имя столбца) проверяется, обновлен ли столбец Discount таблицы AppDta.dbo.Customer, и если да, то проводится вставка строк в таблицу, посредством оператора SELECT
 
 (2) с помощью проверки IF UPDATE
(имя столбца) проверяется, обновлен ли столбец Discount таблицы AppDta.dbo.CustUpdLog , и если да, то проводится выборка строк таблицы 
 (3) с помощью проверки IF UPDATE
(имя столбца) проверяется, обновлен ли столбец Discount таблицы AppDta.dbo.CustUpdLog , и если да, то проводится вставка строк в таблицу, посредством оператора SELECT
 
Упражнение 7:
Номер 1
CREATE TRIGGER CustomerDelete
ON Customer
INSTEAD OF DELETE
AS
SET NOCOUNT ON
IF ( EXISTS (
SELECT *
FROM DELETED JOIN Sale
ON DELETED.CustId = Sale.CustId
WHERE DATEDIFF( DAY, SaleDate, CURRENT_TIMESTAMP ) < 365 ) )
BEGIN
RAISERROR( 'One or more customers have recent sales', 16, 1)
RETURN
END
DELETE
FROM Sale WHERE CustId IN
( SELECT CustId
FROM DELETED )
IF ( @@ERROR > 0 ) BEGIN
ROLLBACK
RAISERROR( 'Could not delete all old sales', 16, 2 )
RETURN
END
DELETE
FROM Customer WHERE CustId IN
( SELECT CustId
FROM DELETED )
IF ( @@ERROR > 0 ) BEGIN
ROLLBACK
RAISERROR( 'Could not delete all old customers', 16, 3 )
RETURN
END
RETURN
Данный сценарий выполняет действия:
Ответ:
 (1) удаляются соответствующие строки таблицы Sale, т.к. все они устарели, в случае неудачи, отменяются все изменения, затем проверяется, имеются ли в таблице Sale прошлогодние заказы удаляемых клиентов, затем удаляются клиенты 
 (2) удаляются соответствующие строки таблицы Sale, т.к. все они устарели, затем проверяется, имеются ли в таблице Sale прошлогодние заказы удаляемых клиентов, затем удаляются клиенты и, в случае неудачи, отменяются все изменения 
 (3) проверяется, имеются ли в таблице Sale прошлогодние заказы удаляемых клиентов, затем удаляются соответствующие строки таблицы Sale, т.к. все они устарели, удаляются клиенты и, в случае неудачи, отменяются все изменения 
Номер 2
CREATE TRIGGER CustomerDelete
ON Customer
INSTEAD OF DELETE
AS
SET NOCOUNT ON
IF ( EXISTS (
SELECT *
FROM DELETED JOIN Sale
ON DELETED.CustId = Sale.CustId
WHERE DATEDIFF( DAY, SaleDate, CURRENT_TIMESTAMP ) <365 ) )
BEGIN
RAISERROR( 'One or more customers have recent sales', 16, 1)
RETURN
END
DELETE
FROM Sale WHERE CustId IN
( SELECT CustId
FROM DELETED )
IF ( @@ERROR > 0 ) BEGIN
ROLLBACK
RAISERROR( 'Could not delete all old sales', 16, 2 )
RETURN
END
DELETE
FROM Customer WHERE CustId IN
( SELECT CustId
FROM DELETED )
IF ( @@ERROR > 0 ) BEGIN
ROLLBACK
RAISERROR( 'Could not delete all old customers', 16, 3 )
RETURN
END
RETURN
Данный сценарий выполняет действия:
Ответ:
 (1) удаляются соответствующие строки таблицы Sale, т.к. все они устарели, затем проверяется, имеются ли в таблице Sale прошлогодние заказы удаляемых клиентов, затем удаляются клиенты и, в случае неудачи, отменяются все изменения 
 (2) проверяется, имеются ли в таблице Sale прошлогодние заказы удаляемых клиентов, затем удаляются соответствующие строки таблицы Sale, т.к. все они устарели, удаляются клиенты и, в случае неудачи, отменяются все изменения 
 (3) удаляются соответствующие строки таблицы Sale, т.к. все они устарели, в случае неудачи, отменяются все изменения, затем проверяется, имеются ли в таблице Sale прошлогодние заказы удаляемых клиентов, затем удаляются клиенты 
Номер 3
CREATE TRIGGER CustomerDelete
ON Customer
INSTEAD OF DELETE
AS
SET NOCOUNT ON
IF ( EXISTS (
SELECT *
FROM DELETED JOIN Sale
ON DELETED.CustId = Sale.CustId
WHERE DATEDIFF( DAY, SaleDate, CURRENT_TIMESTAMP ) < 365 ) )
BEGIN
RAISERROR( 'One or more customers have recent sales', 16, 1)
RETURN
END
DELETE
FROM Sale WHERE CustId IN
( SELECT CustId
FROM DELETED )
IF ( @@ERROR > 0 ) BEGIN
ROLLBACK
RAISERROR( 'Could not delete all old sales', 16, 2 )
RETURN
END
DELETE
FROM Customer WHERE CustId IN
( SELECT CustId
FROM DELETED )
IF ( @@ERROR > 0 ) BEGIN
ROLLBACK
RAISERROR( 'Could not delete all old customers', 16, 3 )
RETURN
END
RETURN
Данный сценарий выполняет действия:
Ответ:
 (1) проверяется, имеются ли в таблице Sale прошлогодние заказы удаляемых клиентов, затем удаляются соответствующие строки таблицы Sale, т.к. все они устарели, удаляются клиенты и, в случае неудачи, отменяются все изменения 
 (2) удаляются соответствующие строки таблицы Sale, т.к. все они устарели, затем проверяется, имеются ли в таблице Sale прошлогодние заказы удаляемых клиентов, затем удаляются клиенты и, в случае неудачи, отменяются все изменения 
 (3) удаляются соответствующие строки таблицы Sale, т.к. все они устарели, в случае неудачи, отменяются все изменения, затем проверяется, имеются ли в таблице Sale прошлогодние заказы удаляемых клиентов, затем удаляются клиенты