2

ここに私のテーブルとして (Entier = Integer // Caractère long variable = Varchar) :

http://i.stack.imgur.com/lNjyy.jpg

ここに画像の説明を入力

ビュー V_Enterprise(idContact, phoneNumber, email, name, city, address) を作成しました

ユーザーがビューを更新できるように、そのビューにトリガーを作成しようとしました:

CREATE TRIGGER test
ON V_Entreprise
INSTEAD OF INSERT
AS 
DECLARE @T_ContactId INT
BEGIN
    INSERT INTO T_Contact 
    SELECT i.phoneNumber, i.email
    FROM Inserted i 

    SELECT @T_ContactId = @@IDENTITY

    INSERT INTO T_Entreprise
    SELECT @T_ContactId, i.name, i.city, i.adress
    FROM Inserted i 
END ;

予想どおり、単純な挿入では機能しますが、一度にいくつかの行を追加すると、@T_ContactId には最初の ID しか含まれていないため失敗します。誰かがそれを修正するのを手伝ってくれますか? INNER JOIN 挿入を使用する必要があるように感じますが、対処方法がわかりません。

4

4 に答える 4

2

トリガーで挿入または削除された値にスカラー変数を設定しないでください。

代わりに OUTPUT 句を使用して、id 値を取得してください。

于 2013-03-01T15:41:32.113 に答える
1

このトリガーは、カーソルに対してループを使用し、テーブル内で特定の一意性を必要としません。

CREATE TRIGGER test
ON V_Enterprise
INSTEAD OF INSERT
AS 
BEGIN
   DECLARE @name    VARCHAR(32)
   DECLARE @city    VARCHAR(32)
   DECLARE @address VARCHAR(32)
   DECLARE @pn      VARCHAR(32)
   DECLARE @email   VARCHAR(32)

   DECLARE cursor1 CURSOR FOR
      SELECT name,city,address,phoneNumber,email FROM inserted;

    OPEN cursor1;
    FETCH NEXT FROM cursor1 INTO @name, @city, @address, @pn, @email;
    WHILE @@FETCH_STATUS = 0
    BEGIN
      INSERT INTO T_Contact (phoneNumber,email) VALUES (@pn, @email);
      INSERT INTO T_Enterprise (idcontact,name,city,address) VALUES
         (@@IDENTITY,@name,@city,@address);
      FETCH NEXT FROM cursor1 INTO @name, @city, @address, @pn, @email;
    END
    CLOSE cursor1;
    DEALLOCATE cursor1;
END
GO
于 2013-03-01T16:56:28.783 に答える
0

phoneNumberemailが一意のキーである場合、次のT_Contactようにすることができます。

CREATE TRIGGER test
ON V_Entreprise
INSTEAD OF INSERT
AS 
DECLARE @T_ContactId INT
BEGIN
    INSERT INTO T_Contact 
    SELECT i.phoneNumber, i.email
    FROM Inserted i 

    SELECT @T_ContactId = @@IDENTITY

    INSERT INTO T_Entreprise
    SELECT
        (SELECT idContact FROM T_Contact
            WHERE phoneNumber = i.phoneNumber AND email = i.email),
        i.name, i.city, i.adress
    FROM Inserted i 
END ;
于 2013-03-01T15:42:46.283 に答える