これはMicrosoft SQL Server 2008でのことです。
EmployeeとEmployeeResultの2つのテーブルがあり、これを行うEmployeeResultで単純なINSERTトリガーを作成しようとしています。
(ジャック、200、セールス)(ジェーン、300、マーケティング)(ジョン、400、エンジニアリング)
Name、Departmentエントリのペアなどを検索する必要があります。
(ジャック、セールス)、(ジェーン、マーケティング)、(ジョン、エンジニアリング)
employeeテーブル内で、そのような従業員が存在しない場合、Employeeテーブルに挿入する必要があります。
私が持っているのは、「???」を修正する方法について不明な点があるこれです:
CREATE TRIGGER trig_Update_Employee
ON [EmployeeResult]
FOR INSERT
AS
IF EXISTS (SELECT COUNT(*) FROM Employee WHERE ???)
BEGIN
INSERT INTO [Employee] (Name, Department) VALUES (???, ???)
END
助けてください、事前に感謝します
スキーマ:
Employee
--------
Name, varchar(50)
Department, varchar (50)
EmployeeResult
--------------
Name, varchar(50)
Salary, int
Department, varchar (50)
トリガーのコンテキストで利用可能な挿入論理テーブルを利用したい場合。挿入されるテーブルのスキーマに一致し、挿入される行を含みます(更新トリガーでは、挿入および削除にアクセスできます)新しいデータと元のデータをそれぞれ表す論理テーブル。)
したがって、現在存在しない従業員/部署のペアを挿入するには、次のようなものを試してみてください。
CREATE TRIGGER trig_Update_Employee
ON [EmployeeResult]
FOR INSERT
AS
Begin
Insert into Employee (Name, Department)
Select Distinct i.Name, i.Department
from Inserted i
Left Join Employee e
on i.Name = e.Name and i.Department = e.Department
where e.Name is null
End
cmsjrには適切なソリューションがありました。私はあなたの将来のトリガー開発のためにいくつかのことを指摘したかっただけです。トリガーへの挿入で値ステートメントを使用している場合、間違ったことをしている可能性が非常に高くなります。トリガーは、挿入、削除、または更新されたレコードのバッチごとに1回起動します。したがって、1つのバッチに10個のレコードが挿入された場合、トリガーは1回起動します。挿入または削除されたデータを参照し、変数と値句を使用している場合は、それらのレコードのいずれかのデータのみを取得します。これにより、データの整合性の問題が発生します。これを修正するには、上記のcmsjrのようにセットベースの挿入を使用するか、カーソルを使用します。カーソルパスを選択しないでください。トリガー内のカーソルは、時間がかかり、テーブルを数時間ロックする可能性があるため、発生を待つ問題です。トリガーからカーソルを一度削除し、インポートプロセスを40分から45秒に改善しました。
誰も複数のレコードを追加するつもりはないと思うかもしれませんが、ほとんどの非データベースユーザーが認識するよりも頻繁に発生します。考えられるすべての挿入、更新、削除の条件下では機能しないトリガーを作成しないでください。新しい顧客から1,000,000件の販売目標レコードをインポートするか、すべての価格を10%更新するか、販売しない製品のベンダーからすべてのレコードを削除する必要がある場合、誰も一度に1つのレコードを使用しません。
このコードを確認してください:
CREATE TRIGGER trig_Update_Employee ON [EmployeeResult] FOR INSERT AS Begin
Insert into Employee (Name, Department)
Select Distinct i.Name, i.Department
from Inserted i
Left Join Employee e on i.Name = e.Name and i.Department = e.Department
where e.Name is null
End