База ответов ИНТУИТ

Программирование в Microsoft SQL Server 2000

<<- Назад к вопросам

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
Данный сценарий выполняет действия:

(Отметьте один правильный вариант ответа.)

Варианты ответа
временная таблица DELETED содержит строки в том случае, когда инструкция INSERT или UPDATE обработала хотя бы одну строку. А временная таблица INSERTED содержит строки в том случае, когда инструкция DELETE или UPDATE обработала хотя бы одну строку. Для инструкции UPDATE таблица DELETE содержит обновленные строки со старыми значениями, а таблица DELETED содержит те же строки с новыми значениями. В приведенном примере учтена еще одна особенность триггеров: триггеры операций DELETE и UPDATE вызываются даже в том случае, если операция не удалила или не обновила ни одной строки (потому что не нашлось строк, соответствующих условию WHERE)
временная таблица DELETED содержит строки в том случае, когда инструкция INSERT или UPDATE обработала хотя бы одну строку. А временная таблица INSERTED содержит строки в том случае, когда инструкция UPDATE обработала ВСЕ строки. Для инструкции UPDATE таблица DELETE содержит обновленные строки со старыми значениями, а таблица DELETED содержит те же строки с новыми значениями. В приведенном примере учтена еще одна особенность триггеров: триггеры операций DELETE и UPDATE вызываются даже в том случае, если операция не удалила или не обновила ни одной строки (потому что не нашлось строк, соответствующих условию WHERE)
временная таблица INSERTED содержит строки в том случае, когда инструкция INSERT или UPDATE обработала хотя бы одну строку. А временная таблица DELETED содержит строки в том случае, когда инструкция DELETE или UPDATE обработала хотя бы одну строку. Для инструкции UPDATE таблица DELETE содержит обновленные строки со старыми значениями, а таблица INSERTED содержит те же строки с новыми значениями. В приведенном примере учтена еще одна особенность триггеров: триггеры операций DELETE и UPDATE вызываются даже в том случае, если операция не удалила или не обновила ни одной строки (потому что не нашлось строк, соответствующих условию WHERE)(Верный ответ)
Похожие вопросы
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
Данный сценарий выполняет действия:
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
Данный сценарий выполняет действия:
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
Данный сценарий выполняет действия:
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
Данный сценарий выполняет действия:
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
Данный сценарий выполняет действия:
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 )  RETURNENDRETURN
Данный сценарий выполняет действия:
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 )  RETURNENDRETURN
Данный сценарий выполняет действия:
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 )  RETURNENDRETURN
Данный сценарий выполняет действия:
DECLARE @CustId INT DECLARE @CustName VARCHAR( 30 ) DECLARE CustCursor CURSOR FOR   SELECT CustId, Name   FROM Customer   ORDER BY CustId   FOR READ ONLY OPEN CustCursor WHILE (0 = 0) BEGIN   FETCH NEXT    FROM CustCursor     INTO @CustId, @CustName   IF ( @@FETCH_STATUS <> 0 ) BREAK  PRINT CAST ( @CustId AS VARCHAR(IO) ) + ' ' + @CustName ENDCLOSE CustCursor DEALLOCATE CustCursor
Данный сценарий выполняет действия:
DECLARE @CustId INT DECLARE @CustName VARCHAR( 30 ) DECLARE CustCursor CURSOR FOR   SELECT CustId, Name   FROM Customer   ORDER BY CustId   FOR READ ONLY OPEN CustCursor WHILE (0 = 0) BEGIN   FETCH NEXT    FROM CustCursor     INTO @CustId, @CustName   IF ( @@FETCH_STATUS <> 0 ) BREAK  PRINT CAST ( @CustId AS VARCHAR(10) ) + ' ' + @CustName ENDCLOSE CustCursor DEALLOCATE CustCursor
Данный сценарий выполняет действия: