игра брюс 2048
Главная / Базы данных / Программирование в 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 прошлогодние заказы удаляемых клиентов, затем удаляются клиенты 




Главная / Базы данных / Программирование в Microsoft SQL Server 2000 / Тест 29