SQL:トリガーがすべての行を収集しているわけではありません

乙女

他のテーブルに新しい行があるときに1つのテーブルを更新する必要があるトリガーに問題があります。

私は2つのテーブルを持っています:

最初:

SELECT 
    [Id], [Timestamp], [MachineName], [StatusId], [Quantity]
FROM [dbo].[Events]

そして2番目のもの:

SELECT 
    [Id], [MachineName], [StatusId], [QuantitySum], [StatusLastRefresh]
FROM [dbo].[ActualParams]

テーブルに[Events]は、StreamAnalyticsからのすべてのマシンのすべてのステータス変更が表示されます。新しい行ごとに、2番目のテーブルが更新され、すべてのマシンの最後の値が表示され、最後のタイムスタンプがStatusLastRefreshに表示されます。実際、テーブルに[ActualParams]は4行のデータがあります。

私はそうするために2つのトリガーを試しました:

ALTER TRIGGER [dbo].[AfterInsertEvent] 
ON [dbo].[Events] 
AFTER INSERT
AS 
    MERGE ActualParams AS ap
    USING (SELECT Id, Machine, Status, Timestamp, Quantity 
           FROM inserted) AS ev ON ev.MachineName = ap.MachineName

    WHEN MATCHED THEN
       UPDATE SET map.StatusId = ev.StatusId, 
                  ap.StatusLastRefresh = ev.Timestamp, 
                  ap.QuantitySum = ap.QuantitySum + ev.Quantity;

トリガー#2:

ALTER TRIGGER [dbo].[AfterInsertEvent] 
ON [dbo].[Events] 
AFTER INSERT
BEGIN
    DECLARE @mn nchar(10), @si int, @ts datetime2(7), @q int

    SELECT @mn = MachineName, @si = StatusId, @ts = Timestamp, @q = Quantity 
    FROM inserted

    UPDATE ActualParams
    SET StatusId = @si, 
        StatusLastRefresh = @ts, 
        QuantitySum = QuantitySum + @q  
    WHERE ActualParams.MachineName = @mn
END

しかし、それらのどれも100%正しく機能しません。

まず、Merge挿入された行がMachineName同時に1つずつある場合トリガーは正常に機能しますが、同じMachineName挿入に対して同時に新しい行がほとんどない場合があり、同時に多くの行を1つに書き込むことができないというエラーが発生します。すべてが行き詰まります。

次に、単純なUpdateトリガーは行をスキップすることがあり、ActualParamsテーブルには実際ではなく以前のStatusId値があります。実際、私は4台のマシンを持っていますが、通常、そのうちの1台のStatusIdが間違っています。20台以上になるとどうなるのかしら。

MachineName すべてのマシンに固有です。

UPDATEでCURSORを試しましたが、それでも行がスキップされ、ステータスが実際ではない場合があります。

CURSORとMERGEを組み合わせる方法がわかりません。おそらくそれが解決策になるでしょう。

2番目のテーブルにも数量を要約したいので、すべての行で反応する必要があります。そのため、どの行もスキップできません(以前に忘れてしまった-編集済み)

何か案は?SSMS17を使用しています。

ゴードン・リノフ

これをupdate/で書いてみませんjoinか?

UPDATE ap
    SET StatusId = i.StatusId,
        StatusLastRefresh = i.TimeStamp
    FROM ActualParams ap
         inserted i
         ON ap.MachineName = i.MachineName;

同じマシンを1回で複数回更新できる場合は、insertウィンドウ関数を使用して最後の行を取得します。

UPDATE ap
    SET StatusId = i.StatusId,
        StatusLastRefresh = i.TimeStamp
    FROM ActualParams ap
         (SELECT i.*,
                 ROW_NUMBER() OVER (PARTITION BY MachineName ORDER BY TimeStamp DESC) as seqnum
          FROM inserted i
         ) i
         ON ap.MachineName = i.MachineName AND seqnum = 1;

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Propelがすべての行を返しているわけではありません

分類Dev

Outlookメッセージを削除するスクリプトがすべてのメッセージを削除しているわけではありません

分類Dev

Pythonの美しいスープetsyスクレーパーがすべてのアイテムを集めているわけではありません

分類Dev

PyCharmがすべてのDjangoテストをテストしているわけではありません

分類Dev

Galaxy S5Lollipop-AndroidStudioデバッガーですべてのブレークポイントが実行を停止するわけではありません

分類Dev

ActiveRecordがすべてのデータベース列を提供しているわけではありません

分類Dev

すべてのシリーズがtsオブジェクトに対して同じ頻度を持っているわけではありません

分類Dev

didReceiveDataがすべてのデータを取得しているわけではありません

分類Dev

VisualStudioがすべてのフォルダーを公開しているわけではありません

分類Dev

MVC送信がすべてのデータを返しているわけではありません

分類Dev

POSTメソッドがすべてのデータを送信しているわけではありません

分類Dev

角度コードがすべての注文を表示しているわけではありません

分類Dev

Djangoobject.filterがすべての結果をロードしているわけではありません

分類Dev

すべてのフォーム入力がカードに収まるわけではありません

分類Dev

エクセルシートのすべての列がPDFの同じページに収まるわけではありません。ExcelVBAを使用して変換している間

分類Dev

Cheerioにはすべてのセレクターが付属しているわけではありません

分類Dev

Cheerioにはすべてのセレクターが付属しているわけではありません

分類Dev

左結合が他のテーブルからすべての行を返しているわけではありません

分類Dev

.NETのGetCountriesがすべての国を配信しているわけではありませんか?

分類Dev

Laravelの職人がすべての列を作成しているわけではありません

分類Dev

Seabornx軸はすべてのデータをカバーしているわけではありません

分類Dev

SQLServerのOPENROWSETを使用してすべての行がExcelファイルからインポートされるわけではありません

分類Dev

すべてのリストアイテムが正しくフローティングしているわけではありません

分類Dev

グリッドビュービューの高さがすべての水平アイテムをラップしているわけではありません

分類Dev

Numpyドット操作はすべてのCPUコアを使用しているわけではありません

分類Dev

FirebaseがAngular4プロジェクトのすべてのウェブページをホストしているわけではありません

分類Dev

Gitがすべてのファイルをプッシュしているわけではありません

分類Dev

Python書き込み関数がすべての画像を保存しているわけではありません

分類Dev

PyYAMLがすべての例を解析しているわけではありません

Related 関連記事

  1. 1

    Propelがすべての行を返しているわけではありません

  2. 2

    Outlookメッセージを削除するスクリプトがすべてのメッセージを削除しているわけではありません

  3. 3

    Pythonの美しいスープetsyスクレーパーがすべてのアイテムを集めているわけではありません

  4. 4

    PyCharmがすべてのDjangoテストをテストしているわけではありません

  5. 5

    Galaxy S5Lollipop-AndroidStudioデバッガーですべてのブレークポイントが実行を停止するわけではありません

  6. 6

    ActiveRecordがすべてのデータベース列を提供しているわけではありません

  7. 7

    すべてのシリーズがtsオブジェクトに対して同じ頻度を持っているわけではありません

  8. 8

    didReceiveDataがすべてのデータを取得しているわけではありません

  9. 9

    VisualStudioがすべてのフォルダーを公開しているわけではありません

  10. 10

    MVC送信がすべてのデータを返しているわけではありません

  11. 11

    POSTメソッドがすべてのデータを送信しているわけではありません

  12. 12

    角度コードがすべての注文を表示しているわけではありません

  13. 13

    Djangoobject.filterがすべての結果をロードしているわけではありません

  14. 14

    すべてのフォーム入力がカードに収まるわけではありません

  15. 15

    エクセルシートのすべての列がPDFの同じページに収まるわけではありません。ExcelVBAを使用して変換している間

  16. 16

    Cheerioにはすべてのセレクターが付属しているわけではありません

  17. 17

    Cheerioにはすべてのセレクターが付属しているわけではありません

  18. 18

    左結合が他のテーブルからすべての行を返しているわけではありません

  19. 19

    .NETのGetCountriesがすべての国を配信しているわけではありませんか?

  20. 20

    Laravelの職人がすべての列を作成しているわけではありません

  21. 21

    Seabornx軸はすべてのデータをカバーしているわけではありません

  22. 22

    SQLServerのOPENROWSETを使用してすべての行がExcelファイルからインポートされるわけではありません

  23. 23

    すべてのリストアイテムが正しくフローティングしているわけではありません

  24. 24

    グリッドビュービューの高さがすべての水平アイテムをラップしているわけではありません

  25. 25

    Numpyドット操作はすべてのCPUコアを使用しているわけではありません

  26. 26

    FirebaseがAngular4プロジェクトのすべてのウェブページをホストしているわけではありません

  27. 27

    Gitがすべてのファイルをプッシュしているわけではありません

  28. 28

    Python書き込み関数がすべての画像を保存しているわけではありません

  29. 29

    PyYAMLがすべての例を解析しているわけではありません

ホットタグ

アーカイブ