Триггеры SQL Server - порядок выполнения

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
30
задан Jim Aho 23 December 2015 в 08:50
поделиться

8 ответов

Используя SetTriggerOrder прекрасен, но если Ваш код зависит от определенной последовательности выполнения, почему бы не обернуть все Ваши триггеры в хранимые процедуры, и имейте первый вызов второе, второй вызов третье, и т.д.

Тогда у Вас просто есть первый, выполняются в триггере.

Кто-то в будущем будет благодарен, что они не должны были рыть вокруг в системной таблице для определения пользовательской последовательности выполнения.

18
ответ дан JosephStyons 27 November 2019 в 23:41
поделиться

Можно использовать , sp_settriggerorder для определения порядка каждого включает таблицу.

Однако я утверждал бы, что Вы будете очень более обеспеченным наличием единственного триггера, который делает несколько вещей. Это особенно поэтому, если порядок будет важен, то так как та важность не будет очень очевидна, если у Вас будет несколько триггеров. Вообразите кого-то пытающегося поддерживать базу данных, months/years вниз дорожка. Конечно, вероятно, будут случаи, где у Вас должно быть несколько триггеров, или это действительно - лучший дизайн, но я начал бы предполагать, что Вы должны иметь один и работать оттуда.

14
ответ дан Rory 27 November 2019 в 23:41
поделиться

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

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

11
ответ дан Jim Aho 27 November 2019 в 23:41
поделиться

sp_settriggerorder только относится ПОСЛЕ триггеров.

5
ответ дан Luke Bennett 27 November 2019 в 23:41
поделиться

Можно гарантировать, какой триггер запущен сначала, какой триггер запущен в последний раз и которые огонь в середине при помощи sp_settriggerorder. Если необходимо синхронизировать больше чем три, это не кажется возможным в SQL Server 2005.

Вот образец, взятый от здесь (Связанная статья имеет намного больше информации).

sp_settriggerorder [ @triggername = ] ‘[ triggerschema. ] triggername’
, [ @order = ] ‘value’
, [ @stmttype = ] ’statement_type’
[ , [ @namespace = ] { ‘DATABASE’ | ‘SERVER’ | NULL } ]
4
ответ дан Frosty 27 November 2019 в 23:41
поделиться

Используйте sp_Settriggerorder хранимая процедура, можно определить порядок выполнения триггера.

sp_settriggerorder [ @triggername = ] ‘[ triggerschema. ] triggername’
, [ @order = ] ‘value’
, [ @stmttype = ] ’statement_type’
[ , [ @namespace = ] { ‘DATABASE’ | ‘SERVER’ | NULL } ]

второй параметр, “order” может принять три значения, что означает, что он может принять во внимание до трех триггеров.

  1. Первый †“Триггер запущен сначала
  2. Последний - Триггер запущен в последний раз
  3. Ни один, что †“Триггер запущен в произвольный порядок.
4
ответ дан Sabyasachi Mishra 27 November 2019 в 23:41
поделиться

Порядок устанавливается SQL-сервером, единственная вещь, которую можно сделать, использовать системный SP (sp_settriggerorder) для установки, какой триггер будет стрелять сначала и который будет стрелять в последний раз.

установка Beyond первые и последние триггеры для увольнения Вы не можете изменить или сказать, который будет использовать SQL-сервер порядка. Поэтому Вы захотите создать свои триггеры, таким образом, они не будут полагаться, какой порядок они уволены. Даже если Вы определяете порядок, в который они стреляют сегодня, он может измениться завтра.

Эта информация основана на SQL-сервере 2000, однако я не верю действию 2005/2008 по-другому в этом отношении.

2
ответ дан Dave_H 27 November 2019 в 23:41
поделиться

Используйте эту системную хранимую процедуру:

sp_settriggerorder[@triggername = ] 'triggername', [@order = ] 'value', [@stmttype = ] 'statement_type'
1
ответ дан Ben Hoffstein 27 November 2019 в 23:41
поделиться
Другие вопросы по тегам:

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