1

次の問題に対処するトリガーを作成しようとしています。挿入されたテーブルから必要な変数を引き出し、それを別のテーブルのデータと組み合わせて、それを1つとして必要なテーブルに挿入しようとすると、行き詰まります(これは、漠然とした/紛らわしいことですが、我慢してください...)

これが私がデータベースを機能させたい方法です:

データベース内の3つのテーブル:

  1. テーブルユーザー:
    識別番号を含むユーザー情報のテーブル
  2. Table PlaneGPSCoordinates:
    ライブGPS座標のテーブル。このテーブルのサイズは変更されず、値が更新されるだけです。
  3. Table MatchingInformation:
    ユーザーID番号と平面座標の2つの列を持つテーブル。

トリガーは次のことを行う必要があります。

  1. テーブル「ユーザー」に挿入された新しい行(つまり、ユーザーがサインアップ)
  2. Triggerは、PlaneGPSCoordinates(キー列を除く)のデータと新しいユーザーのID番号を自動的にコピーし、2つをTableMatchingInformationに挿入します。座標の5行ごとに1つのユーザーID番号があります->つまり、トリガーはMatchingInformationに5行を追加します。ここで、userID=新しいユーザーのIDと座標はすべてテーブルPlaneGPSCoordinatesからコピーされます。

現在、私の不完全なコードは次のようになっています。

CREATE TRIGGER dbo.Matching
ON dbo.UserInfo
FOR INSERT
AS

DECLARE @userID as INT

BEGIN
SET NOCOUNT ON;

SELECT @userID = inserted.ID FROM inserted

INSERT....

END
GO

私はSQLに非常に慣れていないので、最悪の事態を想定します。GPS座標を取得し、それをユーザーIDと組み合わせて、それをマッチングテーブルにプッシュするINSERTステートメントを作成する方法がわかりません...

どんな助けでも大歓迎です!

4

1 に答える 1

1

トリガーを一度に1行を処理するかのように扱うことはできません。複数値句またはネストされた選択を使用して挿入が発生した場合、トリガーは操作全体で1回起動します。つまり、任意の@UserIDを1つだけ処理します。

ここでは、PlaneGPSCoordinatesテーブルに正確に5行があり、それらがすべての新しいユーザーが取得する座標であると想定しています。

CREATE TRIGGER dbo.Matching
ON dbo.UserInfo
FOR INSERT
AS
BEGIN
  SET NOCOUNT ON;
  INSERT dbo.MatchingInformation(GPS1, GPS2, UserID)
    SELECT p.GPS1, p.GPS2, i.UserID
      FROM dbo.PlaneGPSCoordinates AS p
      CROSS JOIN inserted AS i;
END
GO

しかし、これは疑問を投げかけます、なぜすべてのユーザーに同じ座標をコピーするのですか?これは彼らが頻繁に更新するものですか、最初にいくつかのデフォルト値をそこに置きたいだけですか?

于 2012-05-21T17:57:17.447 に答える