2016-06-29 3 views
0

Я пытаюсь создать триггер в SQL Server 2008 R2 для целей аудита. Чтобы получить правильный часовой пояс для разных мест по всей стране, я пытаюсь передать переменную в IF/ELSE IF для изменения часов с помощью функции DATEADD(). Вот мой код:Ожидание ошибки разговора Сервер Sql

CREATE TRIGGER epic_cover_insert 
ON epic_cover 
AFTER INSERT 
AS 
BEGIN 
DECLARE @facilityCode INT 

SET @facilityCode = (SELECT RIGHT(order_num, 3) FROM epic_cover) 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for trigger here 
UPDATE epic_cover 
IF @facilityCode = 403 --for logan 
    BEGIN 
     SET Created_By = CASE WHEN Created_By IS NULL THEN SUSER_NAME() 
          WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' THEN SUSER_NAME() 
          ELSE Created_By END, 
      Created_On = DATEADD(HH,-1,GETDATE() 
    END 
    ELSE IF @facilityCode = 203 -- for Thermont 
     BEGIN 
      SET Created_By = CASE WHEN Created_By IS NULL THEN SUSER_NAME() 
          WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' THEN SUSER_NAME() 
          ELSE Created_By END, 
       Created_On = DATEADD(HH,1,GETDATE()) 
     END 
    ELSE IF @facilityCode = 263 --for Saint Charles 
     BEGIN 
      SET Created_By = CASE WHEN Created_By IS NULL THEN SUSER_NAME() 
          WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' THEN SUSER_NAME() 
          ELSE Created_By END, 
       Created_On = GETDATE() 
     END 
END 
END 

Я получаю всевозможные ошибки, которые все говорят EXPECTING CONVERSATION. Я не уверен, что это значит. Я googled это, и это только добавило к путанице.

+0

Какая ошибка вы получаете и по какой части запроса? –

+0

Все утверждения IF и ELSE IF дают мне ошибки EXPECTING CONVERSATION. – bryanfm92

ответ

0

Сначала при написании триггера вы должны думать о вставке, обновлении или удалении более 1 записи за раз!

Я предполагаю, что сервер sql смотрит на ваш код, но если разные rdbms обратите внимание на него.

Следующая

SET @facilityCode = (SELECT RIGHT(order_num, 3) FROM epic_cover) 

всегда будет давать вам код объекта, который уже в epic_cover, который не то, что вы хотите.

Затем вы пытаетесь смешать и оператор IF с инструкцией по обновлению, которая не разрешена. Но на самом деле у вас нет ни одного из if, и вы можете просто использовать оператор case.

Затем вы обновляете все записи в таблице, а не только те, которые были вставлены. Вам понадобится первичный ключ на столе, если у вас нет одного или способа выяснить, какие записи добавлены! Затем используйте специальную таблицу "inserted".

CREATE TRIGGER epic_cover_insert 
ON epic_cover 
AFTER INSERT 
AS 
BEGIN 

-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for trigger here 
UPDATE epic_cover 
    SET Created_By = CASE WHEN i.Created_By IS NULL THEN SUSER_NAME() 
        WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' THEN SUSER_NAME() 
        ELSE i.Created_By END 
     ,Created_On = CASE 
     -- right function is for strings so I assume order num is a string if not you will need to do some casting 
      WHEN RIGHT(i.order_num, 3) = '403' THEN DATEADD(HH,-1,GETDATE()) 
      WHEN RIGHT(i.order_num, 3) = '203' THEN DATEADD(HH,1,GETDATE()) 
      WHEN RIGHT(i.order_num, 3) = '263' THEN GETDATE() 
      ELSE NULL-- ????? 
     END 
FROM 
    epic_cover e 
    INNER JOIN inserted i 
    ON e.PrimaryKey = i.PrimaryKey 

END 
+0

Это имеет смысл. Я полностью забыл об использовании таблицы вставки. Большое вам спасибо – bryanfm92

+0

классный рад, что это поможет, триггеры - это не самая легкая вещь в мире, чтобы продумать логику! И есть последствия для них ... Во всяком случае, я обновил и удалил переменную из своего кода, потому что она вам не нужна. Если он работает для вас, пожалуйста, примите ответ. http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work thanks – Matt

+0

Принял ваш ответ. Это не только помогло мне сегодня, но и научило меня много. Не могу вас поблагодарить. – bryanfm92

Смежные вопросы