sql >> データベース >  >> RDS >> SQLite

SQLiteトリガー

    概要 :このチュートリアルでは、テーブル内のデータが変更されたときに自動的に起動されるデータベースオブジェクトであるSQLiteトリガーについて説明します。

    SQLiteトリガーとは

    SQLiteトリガーは、 INSERTのときに自動的に実行される名前付きデータベースオブジェクトです。 、 UPDATE またはDELETE ステートメントは、関連するテーブルに対して発行されます。

    SQLiteトリガーが必要なのはいつですか

    多くの場合、トリガーを使用して高度な監査を有効にします。たとえば、給与や住所などの機密データの変更を、変更されるたびにログに記録したいとします。

    さらに、トリガーを使用して、複雑なビジネスルールをデータベースレベルで一元的に適用し、無効なトランザクションを防止します。

    SQLite CREATE TRIGGER ステートメント

    SQLiteで新しいトリガーを作成するには、 CREATE TRIGGERを使用します 次のようなステートメント:

    CREATE TRIGGER [IF NOT EXISTS] trigger_name 
       [BEFORE|AFTER|INSTEAD OF] [INSERT|UPDATE|DELETE] 
       ON table_name
       [WHEN condition]
    BEGIN
     statements;
    END;Code language: SQL (Structured Query Language) (sql)

    この構文では:

    • 最初に、 CREATE TRIGGERの後にトリガーの名前を指定します キーワード。
    • 次に、 BEFOREなどのトリガーがいつ起動されるかを決定します 、 AFTER 、または INSTEAD OF BEFOREを作成できます およびAFTER テーブルでトリガーします。ただし、作成できるのは INSTEAD OFのみです。 ビューでトリガーします。
    • 次に、 INSERT など、トリガーが呼び出される原因となるイベントを指定します 、 UPDATE 、または DELETE
    • その後、トリガーが属するテーブルを示します。
    • 最後に、トリガーロジックを BEGIN ENDに配置します ブロック。これは任意の有効なSQLステートメントにすることができます。

    トリガーが発生する時間とトリガーが発生するイベントを組み合わせると、合計9つの可能性があります。

    • 挿入前
    • 挿入後
    • 更新前
    • 更新後
    • 削除前
    • 削除後
    • INSTEAD OF INSERT
    • INSTEAD OF DELETE
    • INSTEAD OF UPDATE

    UPDATEを使用するとします テーブル内の10行を更新するステートメントの場合、テーブルに関連付けられたトリガーが10回起動されます。このトリガーはFOREACH ROWと呼ばれます 引き金。テーブルに関連付けられたトリガーが1回起動された場合、このトリガーを FOR EACH STATEMENTと呼びます。 トリガー。

    バージョン3.9.2の時点で、SQLiteは FOR EACH ROWのみをサポートします トリガー。 FOR EACH STATEMENTはまだサポートされていません トリガー。

    WHENで条件を使用する場合 句では、条件が真の場合にのみトリガーが呼び出されます。 WHENを省略した場合 句を指定すると、トリガーはすべての行に対して実行されます。

    テーブルを削除すると、関連するすべてのトリガーも削除されることに注意してください。ただし、トリガーが他のテーブルを参照している場合、他のテーブルが削除または更新されても、トリガーは削除または変更されません。

    たとえば、トリガーは peopleという名前のテーブルを参照します 、 peopleを削除します テーブルまたは名前を変更するには、トリガーの定義を手動で変更する必要があります。

    OLD を使用して、挿入、削除、または更新されている行のデータにアクセスできます。 およびNEW 次の形式の参照: OLD.column_name およびNEW.column_name

    OLD およびNEW トリガーが発生する原因となるイベントに応じて、参照を利用できます。

    次の表にルールを示します。:

    アクション リファレンス
    INSERT NEWが利用可能です
    更新 NEWとOLDの両方が利用可能です
    削除 OLDが利用可能です

    SQLiteトリガーの例

    会社のすべてのビジネスリードを保存するために、リードと呼ばれる新しいテーブルを作成しましょう。

    CREATE TABLE leads (
    	id integer PRIMARY KEY,
    	first_name text NOT NULL,
    	last_name text NOT NULL,
    	phone text NOT NULL,
    	email text NOT NULL,
    	source text NOT NULL
    );Code language: SQL (Structured Query Language) (sql)

    1)SQLite BEFORE INSERT トリガーの例

    Leadsに新しいリードを挿入する前にメールアドレスを検証するとします。 テーブル。この場合、 BEFORE INSERTを使用できます トリガー。

    まず、 BEFORE INSERTを作成します 次のようにトリガーします:

    CREATE TRIGGER validate_email_before_insert_leads 
       BEFORE INSERT ON leads
    BEGIN
       SELECT
          CASE
    	WHEN NEW.email NOT LIKE '%_@__%.__%' THEN
       	  RAISE (ABORT,'Invalid email address')
           END;
    END;Code language: SQL (Structured Query Language) (sql)

    NEWを使用しました 挿入されている行の電子メール列にアクセスするための参照。

    メールを検証するために、 LIKEを使用しました 電子メールのパターンに基づいて、電子メールが有効かどうかを判断する演算子。メールが無効な場合は、 RAISE 関数は挿入を中止し、エラーメッセージを発行します。

    次に、無効なメールの行を Leadsに挿入します テーブル。

    INSERT INTO leads (first_name,last_name,email,phone)
    VALUES('John','Doe','jjj','4089009334');Code language: SQL (Structured Query Language) (sql)

    SQLiteはエラー「無効な電子メールアドレス」を発行し、挿入の実行を中止しました。

    3番目に、有効なメールアドレスを含む行を挿入します。

    INSERT INTO leads (first_name, last_name, email, phone)
    VALUES ('John', 'Doe', '[email protected]', '4089009334');Code language: SQL (Structured Query Language) (sql)

    電子メールが有効であるため、挿入ステートメントは正常に実行されました。

    SELECT
    	first_name,
    	last_name,
    	email,
    	phone
    FROM
    	leads;Code language: SQL (Structured Query Language) (sql)

    2)SQLite AFTER UPDATE トリガーの例

    リードの電話やメールは非常に重要なので、この情報を失うわけにはいきません。たとえば、誰かが誤ってメールや電話を間違ったものに更新したり、削除したりします。

    この貴重なデータを保護するには、トリガーを使用して、電話と電子メールに加えられたすべての変更をログに記録します。

    まず、 Lead_logsという新しいテーブルを作成します 履歴データを保存します。

    CREATE TABLE lead_logs (
    	id INTEGER PRIMARY KEY,
    	old_id int,
    	new_id int,
    	old_phone text,
    	new_phone text,
    	old_email text,
    	new_email text,
    	user_action text,
    	created_at text
    );Code language: SQL (Structured Query Language) (sql)

    次に、 AFTER UPDATEを作成します データをlead_logsに記録するトリガー emailに更新があるときはいつでもテーブル またはphone 列。

    CREATE TRIGGER log_contact_after_update 
       AFTER UPDATE ON leads
       WHEN old.phone <> new.phone
            OR old.email <> new.email
    BEGIN
    	INSERT INTO lead_logs (
    		old_id,
    		new_id,
    		old_phone,
    		new_phone,
    		old_email,
    		new_email,
    		user_action,
    		created_at
    	)
    VALUES
    	(
    		old.id,
    		new.id,
    		old.phone,
    		new.phone,
    		old.email,
    		new.email,
    		'UPDATE',
    		DATETIME('NOW')
    	) ;
    END;Code language: SQL (Structured Query Language) (sql)

    WHENの状態にあることに気づきました 句は、電子メールまたは電話の列に変更があった場合にのみトリガーが呼び出されることを指定します。

    3番目に、 Johnの名前を更新します Doeから Smithへ 。

    UPDATE leads
    SET 
       last_name = 'Smith'
    WHERE
       id = 1;Code language: SQL (Structured Query Language) (sql)

    トリガーlog_contact_after_update メールや電話に変更がなかったため、呼び出されませんでした。

    第4に、 Johnのメールアドレスと電話番号の両方を更新します 新しいものに。

    UPDATE leads
    SET 
       phone = '4089998888',
       email = '[email protected]'
    WHERE
       id = 1;Code language: SQL (Structured Query Language) (sql)

    ログテーブルを確認すると、そこに新しいエントリがあることがわかります。

    SELECT
       old_phone, 
       new_phone, 
       old_email, 
       new_email, 
       user_action
    FROM
       lead_logs;Code language: SQL (Structured Query Language) (sql)

    AFTER INSERTを開発できます およびAFTERDELETE Lead_logsにデータを記録するためのトリガー 演習としてのテーブル。

    SQLite DROP TRIGGER ステートメント

    既存のトリガーを削除するには、 DROP TRIGGERを使用します 次のようなステートメント:

    DROP TRIGGER [IF EXISTS] trigger_name;Code language: SQL (Structured Query Language) (sql)

    この構文では:

    • 最初に、 DROP TRIGGERの後にドロップするトリガーの名前を指定します キーワード。
    • 次に、 IF EXISTSを使用します トリガーが存在する場合にのみトリガーを削除するオプション。

    テーブルをドロップすると、SQLiteはテーブルに関連付けられているすべてのトリガーを自動的にドロップすることに注意してください。

    たとえば、 validate_email_before_insert_leadsを削除するには トリガーするには、次のステートメントを使用します:

    DROP TRIGGER validate_email_before_insert_leads;Code language: SQL (Structured Query Language) (sql)

    このチュートリアルでは、SQLiteトリガーを紹介し、データベースからトリガーを作成および削除する方法を示します。


    1. ORACLE SQL:2つの数値の間のすべての整数を取得します

    2. MYSQLでのバルク挿入

    3. データベース開発自動化のためのDevOpsソリューション

    4. LinuxにSQLServerAlwaysOn可用性グループを展開する