ホームページ  >  記事  >  データベース  >  よく使用される SQL トリガーのステートメント (概要)

よく使用される SQL トリガーのステートメント (概要)

青灯夜游
青灯夜游転載
2019-11-23 17:25:537161ブラウズ

この記事は、一般的に使用される SQL トリガー ステートメントをすべての人に向けてまとめたものです。一定の参考値があります。必要な友人は参照できます。すべての人に役立つことを願っています。

よく使用される SQL トリガーのステートメント (概要)

1. 単純なトリガーを作成します

CREATE TRIGGER 触发器名称
ON 表名
FOR INSERT、UPDATE 或 DELETE
AS
    T-SQL 语句

注: トリガー名は引用符で囲まれません。

#2. トリガーの削除

drop trigger 触发器名称

複数のトリガーの削除:

drop trigger 触发器名称,触发器名称

3. トリガーの名前変更

クエリ アナライザーによる名前の変更

exec sp_rename 原名称, 新名称

sp_rename は SQL Server に付属するストアド プロシージャで、現在のデータベース内でユーザーが作成したオブジェクト (テーブル名、リスト、インデックス名など) の名前を変更するために使用されます。 . .

4. INSERT、UPDATE または DELETE

INSTEAD OF

トリガー ステートメントを実行しますが、トリガーをトリガーする SQL ステートメントは実行しません。レコードが削除されると、トリガーで指定されたステートメントが実行され、この時点では削除ステートメントは実行されなくなります。例:

create trigger f
on tbl
instead of delete
as
    insert into Logs...

IF UPDATE(列名)

列が更新されたかどうかを確認します。挿入または更新には使用されますが、削除には使用できません。例:

create trigger f
on tbl
for update
as
    if update(status) or update(title)
        sql_statement --更新了 status 或 title 列

inserted、deleted

これらは 2 つの仮想テーブルです。insert は挿入または更新後に影響を受けるレコードによって形成されたテーブルを保存し、deleted は削除または更新前に形成されたテーブルを保存します。影響を受けるレコードによって形成されるテーブル。例:

create trigger tbl_delete
on tbl
for delete
as
    declare @title varchar(200)
    select @title=title from deleted
    insert into Logs(logContent) values('删除了 title 为:' + title + '的记录')

説明: フィールドタイプがテキストまたはイメージのフィールド値を、挿入または削除された仮想テーブルから取得した場合、取得された値は null になります。

#5. データベース内のすべてのトリガーを表示します

use 数据库名
go
select * from sysobjects where xtype='TR'
sysobjects 保存着数据库的对象,其中 xtype 为 TR 的记录即为触发器对象。在 name 一列,我们可以看到触发器名称。

6. sp_helptext トリガーの内容を表示します

use 数据库名
go
exec sp_helptext '触发器名称'

7 。sp_helptrigger は、トリガーの属性を表示するために使用されます。


sp_helptrigger には 2 つのパラメーターがあります。最初のパラメーターはテーブル名で、2 番目のパラメーターはトリガーのタイプ (char(6) です) ) Type (INSERT、UPDATE、DELETE のいずれか)。省略すると、指定したテーブル内のすべてのタイプのトリガーのプロパティが表示されます。

例:

use 数据库名
go
exec sp_helptrigger tbl

8. 再帰、ネストされたトリガー


再帰には、間接再帰と直接再帰の 2 種類があります。例で説明すると、それぞれ T1 と T2 という名前のテーブル 1 とテーブル 2 があり、T1 と T2 にそれぞれフリップフロップ G1 と G2 があるとします。

間接再帰: T1 で操作して G1 をトリガー、G1 で T2 で操作して G2 をトリガー、G2 で T1 で操作して G1 を再度トリガーします...

直接再帰: T1 で操作して、トリガー G1 , G1 は T1 を操作して G1 を再度トリガーします...

ネストされたトリガー

は間接再帰と似ています。間接再帰はループを形成する必要がありますが、ネストされたトリガーは必ずしも形成する必要はありませんこのようにして、リングを T1->T2->T3... と連続的にトリガーでき、最大 32 レベルのネストが可能です。

直接再帰の設定

デフォルトでは、直接再帰は禁止されています。許可するように設定するには 2 つの方法があります:

T-SQL: exec sp_dboption 'dbName', '再帰トリガー'、true

EM: データベースを右クリックし、[プロパティ] > [オプション] をクリックします。

間接再帰とネストを設定する

デフォルトでは、間接再帰とネストが許可されています。これを無効にする方法は 2 つあります:

T-SQL: exec sp_configure 'ネストされたトリガー', 0 -- 2 番目のパラメータは 1 で、許可されていることを意味します。

EM: [登録] -> [プロパティ] -> [サーバー設定] を右クリックします。

9. ロールバックのトリガー

多くの登録システムでは登録後にユーザー名を変更できないことがわかりましたが、これは主にアプリケーションによって決定されます。データベース テーブルを変更する場合、そのユーザー名も変更できます。トリガーでロールバックを使用すると、ユーザー名が変更できないことをうまく認識できます。

use 数据库名
go
create trigger tr
on 表名
for update
as
    if update(userName)
        rollback tran

重要なのは最後の 2 つの文にあり、次のように説明されています。 userName 列が更新された場合は、トランザクションをロールバックします。

10. トリガーの無効化と有効化

Disable: alter table テーブル名 disable trigger トリガー名

Enable: alter table テーブル名 Enable Trigger トリガー名

複数のトリガーがある場合は、トリガー名をカンマで区切ります。

「トリガー名」を「ALL」に置き換えると、テーブルのすべてのトリガーを無効または有効にすることを意味します。

11. 挿入、変更、削除を決定する

create TRIGGER [updatetest] ON [dbo].[TEST] 
FOR INSERT, UPDATE, DELETE 
AS
begin
    DECLARE
    @IsInsert bit,
    @IsUpdate bit,
    @IsDelete bit
    IF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted)
        SET @IsInsert = 1
    ELSE
        SET @IsInsert = 0
     
    IF EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
        SET @IsUpdate = 1
    ELSE
        SET @IsUpdate = 0
     
    IF NOT EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
        SET @IsDelete = 1
    ELSE
        SET @IsDelete = 0 
     
    if (@IsUpdate=1)
       PRINT 'updated '
     if (@IsInsert=1)
       PRINT 'insert '
     if (@IsDelete=1)
       PRINT 'delete 'end
推奨学習:

MySQL チュートリアル

以上がよく使用される SQL トリガーのステートメント (概要)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。