web-dev-qa-db-ja.com

SQL Server 2008-簡単なINSERTトリガーの作成を支援

これは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)
22

トリガーのコンテキストで利用可能な挿入論理テーブルを利用したい場合。挿入されるテーブルのスキーマに一致し、挿入される行を含みます(更新トリガーでは、挿入および削除にアクセスできます)新しいデータと元のデータをそれぞれ表す論理テーブル。)

したがって、現在存在しない従業員/部署のペアを挿入するには、次のようなものを試してみてください。

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
67
cmsjr

cmsjrには適切なソリューションがありました。私はあなたの将来のトリガー開発のためにいくつかのことを指摘したかっただけです。トリガーへの挿入で値ステートメントを使用している場合、間違ったことをしている可能性が非常に高くなります。トリガーは、挿入、削除、または更新されたレコードのバッチごとに1回起動します。したがって、1つのバッチに10個のレコードが挿入された場合、トリガーは1回起動します。挿入または削除されたデータを参照し、変数と値句を使用している場合は、それらのレコードのいずれかのデータのみを取得します。これにより、データの整合性の問題が発生します。これを修正するには、上記のcmsjrのようにセットベースの挿入を使用するか、カーソルを使用します。カーソルパスを選択しないでください。トリガー内のカーソルは、時間がかかり、テーブルを数時間ロックする可能性があるため、発生を待つ問題です。トリガーからカーソルを一度削除し、インポートプロセスを40分から45秒に改善しました。

誰も複数のレコードを追加するつもりはないと思うかもしれませんが、ほとんどの非データベースユーザーが認識するよりも頻繁に発生します。考えられるすべての挿入、更新、削除の条件下では機能しないトリガーを作成しないでください。新しい顧客から1,000,000件の販売目標レコードをインポートするか、すべての価格を10%更新するか、販売しない製品のベンダーからすべてのレコードを削除する必要がある場合、誰も一度に1つのレコードを使用しません。

27
HLGEM

このコードを確認してください:

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
2
deepak