ホームページ > php教程 > PHP开发 > SQLトリガー操作の詳細説明

SQLトリガー操作の詳細説明

高洛峰
リリース: 2016-12-14 16:28:08
オリジナル
1531 人が閲覧しました

トリガーは、テーブルの挿入、更新、削除時に自動的に実行される特別なストアド プロシージャです。トリガーは通常、より複雑なチェック制約を持つ制約で使用されます。トリガーと通常のストアド プロシージャの違いは、トリガーが特定のテーブルに対して動作することです。更新、挿入、削除などの操作中に、システムはテーブル上の対応するトリガーを自動的に呼び出して実行します。 SQL Server 2005 のトリガーは、DML トリガーと DDL トリガーの 2 つのカテゴリに分類できます。DDL トリガーは、さまざまなデータ定義言語ステートメントに影響を与え、これらのステートメントには、create、alter、drop ステートメントがトリガーされます。

共通のトリガーが 3 つあり、それぞれ挿入、更新、削除イベントに適用されます。

なぜトリガーを使用する必要があるのですか?たとえば、次の 2 つのテーブル:

Create Table Student BorrowRecord int Identity(1,1), StudentID ReturnDate Datetime、ReturnDate -- 返却時間

...

)使用されているものは次のとおりです:
1.学生の学生番号を変更します。彼の借用記録がその学生に関連付けられたままであることを望みます (つまり、借用記録テーブルの学生番号も同時に変更されます)。 2. 学生が卒業した場合、私は次のようにします。学生証を削除し、図書の貸出記録も削除したいと考えています。
待って。

現時点ではトリガーを使用できます。 1 の場合、更新トリガーを作成します:




Create Trigger truStudent
トリガーの作成 トリガーの作成イベントトリガー
As As イベントトリガー後の処理
if Update (Studentid)

Begin


BORROWRECORD の更新
Studentid = I を設定.Studentid
BORROWRECORD Br から、削除 D、挿入 I -削除および挿入

D = d.Studentid

End


トリガー内の 2 つの一時テーブル (削除と挿入) を理解します。 Deleted と Inserted はそれぞれ、イベントをトリガーしたテーブルの「古いレコード」と「新しいレコード」を表すことに注意してください。
データベース チュートリアル システムには、テーブル内で変更される情報を保存するために使用される 2 つの仮想テーブルがあります。つまり、 s ’ s ‐ ‐ ‐ レコードは保存されません
新しいレコードの保存に使用される場合に変更します更新に使用される場合は、更新前のレコードが保存されます。削除されたレコードは保存されません。更新プロセスは、新しいレコードを挿入されたテーブルに生成し、古いレコードを挿入されたテーブルにコピーすると見なされます。削除されたテーブルを削除し、Student レコードを削除して新しいレコードを書き込みます。



2 の場合、削除トリガーを作成します

トリガー trdStudent を作成します

On Student
削除用

As

Delete BorrowRecord

From BorrowRecord br , Delted d

use using using ' using ' use ' use ' s ' using d d. この例では、トリガーのキーがわかります: A. 2 つの一時テーブル; B. トリガー メカニズム

DML トリガーは次のように分割されます:

1. トリガー後 (トリガー後にトリガー)

a.
B. 更新トリガー

C、削除トリガー

2、トリガー(前のトリガー)の代わりに

このうち、AFTER トリガーは、挿入、更新、削除の特定の操作のみをトリガーとする必要があり、テーブルに定義されています。トリガーの代わりに、定義された操作 (挿入、更新、削除) は実行されず、トリガー自体のみが実行されることを意味します。トリガーの代わりに、テーブルまたはビューにトリガーを定義できます。

トリガーには、挿入テーブル (挿入テーブル) と削除テーブル (削除テーブル) の 2 つの特別なテーブルがあります。これら 2 つは論理テーブルと仮想テーブルです。システムはメモリ内に 2 つのテーブルを作成しますが、それらはデータベースには保存されません。さらに、両方のテーブルは読み取り専用であり、データは読み取りのみ可能で、変更はできません。これら 2 つのテーブルの結果は、変更されたトリガーが適用されるテーブルと常に同じ構造になります。トリガーが作業を完了すると、2 つのテーブルが削除されます。挿入されたテーブルのデータは挿入または変更後のデータであり、削除されたテーブルのデータは更新または削除前のデータです。

データを更新するときは、まずテーブルのレコードを削除してから、レコードを追加します。このようにして、挿入および削除されたテーブル内のデータ レコードが更新されます。トリガー自体はトランザクションであるため、トリガー内の変更されたデータに対していくつかの特別なチェックを実行できることに注意してください。条件が満たされない場合は、トランザクション ロールバックを使用して操作を元に戻すことができます。

Ø トリガーの作成

構文

create Trigger tgr_name

on table_nameinstead of 触发器 with encrypted Trigger

for update...

as

Transact-SQL

# 挿入型トリガーを作成します

- -変数を定義する

declare @id int, @name varchar(20), @temp int;
--挿入されたテーブルに挿入されたレコード情報をクエリする
select @id = id, @name = name from Inserted;
set @name = @name + Convert(varchar, @id);
set @temp = @id / 2;
学生の値に挿入(@name, 18 + @id, @temp, @id);
print '学生を追加しました! ';
go
--データを挿入します
クラスに挿入しますvalues('5class', getDate());
--データをクエリします
クラスから選択*;
学生からIDで並べ替えます;

トリガーを挿入します。新しく挿入されたレコードを挿入されたテーブルに追加します。



# 削除タイプのトリガーを作成します

-- 削除タイプのトリガーを削除します
if (object_id('tgr_classes_delete', 'TR') is not null)

トリガー tgr_classes_delete を削除します

go

クラス上にトリガー tgr_classes_delete

を作成します

削除する--トリガーを削除します

print 'バックアップ データ内...';

if (object_id('classesBackup', 'U') is not null)

--ClassesBackup が存在する場合、データを直接挿入します
classBackup select name に挿入します。 createDate from selected;
else
--クラスなしバックアップは作成されてから挿入されます
select * intoclassesBackup from added;
print 'データのバックアップが成功しました! ';
go
--
--影響を受ける行の数を表示しません
--nocount on を設定します;
name = '5 クラス' のクラスを削除します;
--データをクエリします
select * fromclasses;
select * fromclassesBackup;

削除トリガーは、データを削除するときに、削除されたばかりのデータを削除されたテーブルに保存します。



# 更新タイプのトリガーを作成します

-- 更新タイプのトリガーを更新します
if (object_id('tgr_classes_update', 'TR') is not null)
トリガー tgr_classes_update を削除します

go

更新用のクラスにトリガー tgr_classes_update

を作成します

as

宣言 @oldName varchar(20), @newName varchar(20);

--更新前のデータ

select @oldName = 削除された名前;
if (exists (select * from students where name like '% ' + @ OLDNAME +'%'))
開始
- 更新されたデータ
を選択します
@newname = 挿入された名前を選択します; e) where name like '%' + @oldName + '%';
print 'データのカスケード変更が成功しました! ';
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ';
go
--クエリデータ
select * from students order by id;
select * from Classs;
update drivers set name = 'Class 5' where name = 'Class 5';

更新トリガーが更新されますデータ取得後、更新前のデータは挿入した表に保存され、更新されたデータは挿入した表に保存されます。



# update 更新列トリガー

if (object_id('tgr_classes_update_column', 'TR') is not null)
トリガー tgr_classes_update_column を削除
go
クラス上にトリガー tgr_classes_update_column
を更新用に作成します

-- 列レベルトリガー: クラス作成時刻が更新されたかどうか if (update(createDate))

begin

raisError('システム プロンプト: クラス作成時刻を変更できません!', 16, 11) --Test

select * from Student order by id;

select * fromclasses;

updateclasses set createDate = getDate() where id = 3;

updateclasses set name = 'Class 4' where id = 7;

Update 列レベルのトリガーは、update を使用して次のことを行うことができます。列レコードを更新するかどうかを決定します。



# タイプトリガーの代わりに

トリガーの代わりに、定義された操作 (挿入、更新、削除) を実行せず、トリガー自体のコンテンツのみを実行することを意味します。

文法を作成する

更新の代わりに暗号化を使用してテーブル名
にトリガー tgr_name
を作成します...
T-SQL

)

トリガー tgr_classes_inteadOf

go

delete/* の代わりにクラス上にトリガー tgr_classes_inteadOf

を作成します、更新、 insert*/
as
destroy @id int, @name varchar(20);
-- 削除された情報、疾患の割り当てを照会します
select @id = id, @name = name from added;
print 'id: ' + Convert( varchar, @id) + ', name: ' + @name;
--まず生徒情報を削除します
cid = @id;の生徒を削除します
--クラスの情報を削除します
id = @id;のクラスを削除します
print ' [ id: ' + Convert(varchar, @id) + '、name: ' + @name + ' ] 情報の削除に成功しました。 ';
go
--test
select * from students order by id;
select * fromclasses;
delete class where id = 7;



# カスタムメッセージを表示 raiseerror

if (object_id('tgr_message' , 'TR') は null ではありません)

トリガー tgr_message をドロップします

go

生徒にトリガー tgr_message を作成します

挿入後、raisError('tgr_message トリガーがトリガーされました', 16, 10);

go
--test
in​​sert として更新しますinto students value('lily', 22, 1, 7);
Update Student set sex = 0 where name = 'lucy';
select * from Student order by ID;

# トリガーを変更

トリガー tgr_message を変更
on Student
after delete
as raisError('tgr_message トリガーがトリガーされました', 16, 10);

go

--test

delete from students where name = 'lucy';


# トリガーを有効化および無効化します

--トリガーを無効にする
disable Trigger tgr_message on Student;
--トリガーを有効にする
enable Trigger tgr_message on Student;

# 作成されたトリガー情報をクエリ

--既存のトリガーをクエリ
select * from sys .triggers;
select * from sys.オブジェクト where type = 'TR';

-- トリガー起動イベントを表示します

sys.trigger_events から te.* を選択し、t.object_id = te.object_id で sys.triggers t に参加します

where t.parent_class = 0 および t. name = 'tgr_valid_data';


--作成トリガーステートメントを表示します
exec sp_helptext 'tgr_message';



# 例、挿入されたデータを確認します

if ((object_id(' tgr_valid_data', 'TR') が null ))
トリガー tgr_valid_data をドロップします
go

学生にトリガー tgr_valid_data を作成します

insert

as

@age int を宣言した後、

select @name = s .name, @age = s.age from挿入された s;

if (@age < 18)
begin
raisError('挿入された新しいデータの年齢に問題があります', 16, 1);
rollback tran;
end
go
--test
insert into studentsvalue('forest', 2, 0, 7);
insert into students names('forest', 22, 0, 7);
select * from Student order by id;

# 例、操作ログ

if (object_id('log' 、'U') は null ではありません)
テーブル ログを削除
go
create table log(
id intidentity(1, 1) 主キー,
アクション varchar(20 ),
createDate datetime default getDate()

)

go

if (exists (select * from sys.objects where name = 'tgr_student_log'))

トリガー tgr_student_log を削除
go
挿入、更新、削除
の後にトリガー tgr_student_log を学生に作成します
if ((exists (select 1 from sys.objects挿入済み)) および (存在します (削除済みから 1 つを選択)))
begin
log(action) に挿入します、values('updated');
end
else if (存在します (挿入済みから 1 つを選択)、存在しない (から 1 つを選択)削除されました))
begin
insert into log(action)values('inserted');
end
else if (存在しません (挿入されたものから 1 を選択) かつ存在します (削除されたものから 1 を選択))
begin
log(action) に挿入します)values('deleted');
end
go
--test
生徒に挿入values('king', 22, 1, 7);
生徒を更新 set sex = 0 where name = 'king';
生徒を削除ここで name = 'king';
ログから * を選択;
ID による生徒の順序から * を選択;



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート