「行レベルのトリガー」と「ステートメントレベルのトリガー」の違いを理解するのに苦労しています。
私の理解では、ステートメントレベルのトリガーが作成されるシナリオでは、テーブル全体を変更できます。行レベルのトリガーでは、トリガーの指定されたイベントの影響を受けるタプルのみを変更できます。
これは正しいです?誰かが2つの例を持っていますか?
主な違いは、DBMSに依存する、トリガーによって変更できるものではありません。トリガー(行またはステートメントレベル)は、同じテーブルまたは他のテーブルの1つまたは複数の行*を変更し、カスケード効果(他のアクション/トリガーをトリガーする)をもたらす場合がありますが、これらはすべてDBMSに依存します。
主な違いは、トリガーがアクティブ化される回数です。1M行のテーブルがあり、次のように実行するとします。
UPDATE t
SET columnX = columnX + 1
ステートメントレベルのトリガーは1回アクティブになります(行が更新されていない場合でも)。行レベルのトリガーは、更新された行ごとに1回、100万回アクティブになります。
もう1つの違いは、順序またはアクティブ化です。たとえば、Oracleでは、4つの異なるタイプのトリガーが次の順序でアクティブ化されます。
Before the triggering statement executes
Before each row that the triggering statement affects
After each row that the triggering statement affects
After the triggering statement executes
前の例では、次のようになります。
Before statement-level trigger executes
Before row-level trigger executes
One row is updated
After row-level trigger executes
Before row-level trigger executes
Second row is updated
After row-level trigger executes
...
Before row-level trigger executes
Millionth row is updated
After row-level trigger executes
After statement-level trigger executes
補遺
*トリガーによって変更できる行について:DBMSの特定の実装またはトリガーに応じて、DBMSごとに制限が異なります。たとえば、Oracleは、行レベルのトリガーがテーブル全体(SELECT MAX(col) FROM tablename
)から選択した場合や、/に関連する行だけでなく他の行またはテーブル全体を変更した場合など、「テーブルの変更」エラーを表示する場合があります。からトリガーされます。
もちろん、行レベルのトリガー(Oracleまたはその他の場合)が、その変更によってトリガーされた行を変更することは完全に有効であり、これは非常に一般的な使用法です。dbfiddle.ukの例。
他のDBMSには、どのタイプのトリガーでも実行できることや、提供されるトリガーのタイプについても異なる制限がある場合があります(BEFORE
たとえば、トリガーがないもの、ステートメントレベルのトリガーがまったくないものなど)。
クライアントが100万行を変更するステートメント(ステートメントレベルのトリガー)を実行した後、トリガーアクションを1回実行することができます。または、変更された行ごとに1回アクションをトリガーすることもできます(行レベルのトリガー)。
例:すべての高校の先輩が卒業することを確実にするトリガーがあるとしましょう。つまり、シニアのグレードが12で、それを13に上げる場合、グレードをに設定しNULL
ます。
ステートメントレベルのトリガーの場合、increase-gradeステートメントを実行した後、テーブル全体を1回チェックして、グレード13のnowsをに更新しNULL
ます。
行レベルのトリガーの場合、更新されるすべての行の後で、新しい行の成績NULL
が13の場合に更新されます。
ステートメントレベルのトリガーは次のようになります。
create trigger stmt_level_trigger
after update on Highschooler
begin
update Highschooler
set grade = NULL
where grade = 13;
end;
行レベルのトリガーは次のようになります。
create trigger row_level_trigger
after update on Highschooler
for each row
when New.grade = 13
begin
update Highschooler
set grade = NULL
where New.ID = Highschooler.ID;
end;
SQLiteはステートメントレベルのトリガーをサポートしていないため、SQLiteではFOR EACH ROW
オプションであることに注意してください。
1)行レベルのトリガーは、挿入、更新、または削除などの行のセットに対してアクションを実行するために使用されます
例:-一連の行を削除する必要があり、同時に、削除された行も監査目的で新しいテーブルに挿入する必要があります。
2)ステートメントレベルトリガー:-通常、実行しているイベントに制限を課すために使用されます。
例:-午後10時から午前6時の間にデータを削除する制限。
お役に立てれば:)
ステートメントレベルのトリガーの主な違いは次のとおりです。
ステートメントレベルのトリガー:名前に基づいて、ステートメントが実行された場合に機能します。影響を受ける行数や行数に依存しません。1回だけ実行されます。Exp:部門HRのすべての従業員の給与を更新し、最後に影響を受ける行数を知りたい場合は、給与が増加した数を意味するので、ステートメントレベルのトリガーを使用します。ステートメントレベルであるため、ゼロ行が更新されてもトリガーが実行されることに注意してください。いずれかのステートメントが実行された場合、トリガーが呼び出されます。行に影響を与えているかどうかは関係ありません。
行レベルのトリガー:行が影響を受けるたびに実行されます。影響を受ける行がゼロの場合、行レベルのトリガーは実行されません。部門がHRであるempテーブルから1人のemployyeを削除し、従業員がempテーブルから削除されるとすぐに、HRセクションのdeptテーブルのカウントを減らす必要があるとします。 1.次に、行レベルのトリガーを選択する必要があります。
ステートメントレベルのトリガーは、dmlステートメントの行に対して1回だけです。levalトリガーは、dmlステートメントの各行に対してです。
行数が変更されたときにステートメントを実行する場合は、ステートメントレベルのトリガーで実行できます。viseversa...行数を変更するたびにステートメントを実行する場合は、行レベルに進む必要があります。トリガー..
例:ステートメントレベルのトリガーは、テーブルが変更されたときに機能します。その後、より多くのレコードが影響を受けます。行レベルのトリガーは、各行の更新または変更時に機能します。