Триггер для увольнения, только если условие соблюдают в SQL Server

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

27
задан Brian Webster 5 October 2012 в 02:11
поделиться

6 ответов

Учитывая, что оператор Where не работал, возможно, это будет:

CREATE TRIGGER 
    [dbo].[SystemParameterInsertUpdate]
ON 
    [dbo].[SystemParameter]
FOR INSERT, UPDATE 
AS
  BEGIN
    SET NOCOUNT ON

      If (SELECT Attribute FROM INSERTED) LIKE 'NoHist_%'
      Begin
          Return
      End

      INSERT INTO SystemParameterHistory 
      (
        Attribute,
        ParameterValue,
        ParameterDescription,
        ChangeDate
      )
    SELECT
      Attribute,
      ParameterValue,
      ParameterDescription,
      ChangeDate
    FROM Inserted AS I
END
41
ответ дан Joel Coehoorn 28 November 2019 в 04:54
поделиться

Ваш, где пункт должен был работать. Я в замешательстве относительно того, почему это не сделало. Позвольте мне показать Вам, как я выяснил бы проблему с, где пункт, поскольку это могло бы помочь Вам для будущего.

, Когда я создаю триггеры, я запускаю в окне запроса путем составления временной таблицы, названной #inserted (и или #deleted) со всеми столбцами таблицы. Тогда я popultae это с типичными значениями (Всегда несколько записей и я пытаемся поразить тестовые сценарии в значениях)

Тогда я пишу свою триггерную логику, и я могу протестировать без него на самом деле находиться в триггере. В случае как Ваш, где пункт, не делающий, что ожидалось, я мог легко протестировать путем комментирования вставки для наблюдения то, что возвращал выбор. Я тогда, вероятно, легко был бы в состоянии видеть, какова проблема была. Я уверяю Вас что, где clasues действительно работают в триггерах, если они записаны правильно.

, Как только я знаю, что код работает правильно на все случаи, я глобальная замена #inserted со вставленным и добавляет создать триггерный код вокруг этого и вуаля, протестированный триггер.

AS я сказал в комментарии, у меня есть озабоченность, что решение, которое Вы выбрали, не будет работать правильно в нескольких рекордная вставка или обновление. Триггеры должны всегда писаться для составления этого, поскольку Вы не можете предсказать, если и когда они произойдут (и они действительно происходят в конечном счете с в значительной степени каждой таблицей.)

5
ответ дан HLGEM 28 November 2019 в 04:54
поделиться

Как насчет этого?

CREATE TRIGGER 
[dbo].[SystemParameterInsertUpdate]
ON 
[dbo].[SystemParameter]
FOR INSERT, UPDATE 
AS
BEGIN
SET NOCOUNT ON
  IF (LEFT((SELECT Attribute FROM INSERTED), 7) <> 'NoHist_') 
  BEGIN
      INSERT INTO SystemParameterHistory 
      (
        Attribute,
        ParameterValue,
        ParameterDescription,
        ChangeDate
      )
    SELECT
      Attribute,
      ParameterValue,
      ParameterDescription,
      ChangeDate
   FROM Inserted AS I
END
END
7
ответ дан Matty 28 November 2019 в 04:54
поделиться

_ символ является также подстановочным знаком, BTW, но я не уверен, почему это не работало на Вас:

CREATE TRIGGER 
    [dbo].[SystemParameterInsertUpdate]
ON 
    [dbo].[SystemParameter]
FOR INSERT, UPDATE 
AS
  BEGIN
    SET NOCOUNT ON
      INSERT INTO SystemParameterHistory 
      (
        Attribute,
        ParameterValue,
        ParameterDescription,
        ChangeDate
      )
    SELECT
      I.Attribute,
      I.ParameterValue,
      I.ParameterDescription,
      I.ChangeDate
    FROM Inserted AS I
    WHERE I.Attribute NOT LIKE 'NoHist[_]%'
END
5
ответ дан Cade Roux 28 November 2019 в 04:54
поделиться

Используя ПОДОБНЫЙ даст Вам опции для определения, на что остальная часть строки должна быть похожей, но если правило, только запускается с 'NoHist _', это действительно не имеет значения.

-1
ответ дан Daniel M 28 November 2019 в 04:54
поделиться

Для триггеров в целом, необходимо использовать курсор для обработки, вставляет или обновления нескольких строк. Например:

DECLARE @Attribute;
DECLARE @ParameterValue;
DECLARE mycursor CURSOR FOR SELECT Attribute, ParameterValue FROM inserted;
OPEN mycursor;
FETCH NEXT FROM mycursor into @Attribute, @ParameterValue;
WHILE @@FETCH_STATUS = 0
BEGIN

If @Attribute LIKE 'NoHist_%'
      Begin
          Return
      End

etc.

FETCH NEXT FROM mycursor into @Attribute, @ParameterValue;
END

Триггеры, по крайней мере, в SQL Server, являются большой болью, и я избегаю использования их вообще.

-1
ответ дан 28 November 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: