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, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Учитывая, что оператор 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
Ваш, где пункт должен был работать. Я в замешательстве относительно того, почему это не сделало. Позвольте мне показать Вам, как я выяснил бы проблему с, где пункт, поскольку это могло бы помочь Вам для будущего.
, Когда я создаю триггеры, я запускаю в окне запроса путем составления временной таблицы, названной #inserted (и или #deleted) со всеми столбцами таблицы. Тогда я popultae это с типичными значениями (Всегда несколько записей и я пытаемся поразить тестовые сценарии в значениях)
Тогда я пишу свою триггерную логику, и я могу протестировать без него на самом деле находиться в триггере. В случае как Ваш, где пункт, не делающий, что ожидалось, я мог легко протестировать путем комментирования вставки для наблюдения то, что возвращал выбор. Я тогда, вероятно, легко был бы в состоянии видеть, какова проблема была. Я уверяю Вас что, где clasues действительно работают в триггерах, если они записаны правильно.
, Как только я знаю, что код работает правильно на все случаи, я глобальная замена #inserted со вставленным и добавляет создать триггерный код вокруг этого и вуаля, протестированный триггер.
AS я сказал в комментарии, у меня есть озабоченность, что решение, которое Вы выбрали, не будет работать правильно в нескольких рекордная вставка или обновление. Триггеры должны всегда писаться для составления этого, поскольку Вы не можете предсказать, если и когда они произойдут (и они действительно происходят в конечном счете с в значительной степени каждой таблицей.)
Как насчет этого?
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
_
символ является также подстановочным знаком, 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
Используя ПОДОБНЫЙ даст Вам опции для определения, на что остальная часть строки должна быть похожей, но если правило, только запускается с 'NoHist _', это действительно не имеет значения.
Для триггеров в целом, необходимо использовать курсор для обработки, вставляет или обновления нескольких строк. Например:
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, являются большой болью, и я избегаю использования их вообще.