質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

4118閲覧

SQLサーバーでのトリガーの条件分岐について、特定の列の値が変更された際実行したい

milkwalking

総合スコア60

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/09/04 05:33

編集2019/09/04 07:34

前提・実現したいこと

Windowsアプリケーションの開発を行っております。
「stock_orders」テーブルの列「warehouses_id」の値が更新された際に
「c_stock_orders」テーブルのstock_orders_id列とinsert_at列へインサートをトリガーにて行いたいです。
下記は「stock_orders」テーブルのトリガー内容です。
USE [******]はデータベース名なので暗号化させていただきます。

SQL

1 2USE [******] 3GO 4/****** Object: Trigger [dbo].[ct_stock_orders_update] Script Date: 2019/09/04 14:24:22 ******/ 5SET ANSI_NULLS ON 6GO 7SET QUOTED_IDENTIFIER ON 8GO 9ALTER TRIGGER[dbo].[ct_stock_orders_update] 10ON [dbo].[stock_orders] 11AFTER UPDATE 12AS 13BEGIN 14 SET NOCOUNT ON; 15 IF UPDATE(warehouses_id) 16 BEGIN 17INSERT INTO c_stock_orders 18(stock_orders_id,insert_at) 19 SELECT id, GETDATE() 20 FROM inserted; 21 END 22END

お手数ですが、ご教示いただければ幸いです。

発生している問題・エラーメッセージ

エラーなどは現在ないのですが、warehouses_id列以外の値が更新された際もインサートが行われております。

補足情報(FW/ツールのバージョンなど)

言語はC#
Windows Formを使用してアプリを作成中です
SQLサーバー
Microsoft SQL Server 2014 - 12.0.2269.0 (X64)
Express Edition (64-bit) on Windows NT 6.3 <X64> (Build 17763: )
VisualStudio2017という環境です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shirokuma4690

2019/09/04 13:14

INSERTしたいときとしたくないときの状況の違いをもう少し詳しく記載してください。 warehouses_id列の値が変更されたときのみINSERTしたいのかと思ったら違うようなので
milkwalking

2019/09/05 02:14

shirokuma様 コメントありがとうございます。 当初の仕様では「warehouses_id列の値が同じ値でもUPDATEされたときのみINSERTしたい」 でしたが今日の朝「warehouses_id列の値が変更されたときのみINSERTしたい」に仕様変更になりました。そのうえで実装した内容記載いたします。
guest

回答3

0

deletedとinsertedを比較してwarehouses_idが変更されたかどうか確認すれば良いのでは。

投稿2019/09/04 07:11

gentaro

総合スコア8949

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

milkwalking

2019/09/04 07:33

変更されていなくても(もし同じ値でも)、その列にアップデートをかけたかどうかで発動をしてほしいのです。
milkwalking

2019/09/04 07:43

gentaro様 ありがとうございます。もう少し実現方法を考えてみます。
guest

0

ベストアンサー

トリガーで行うのではなく、ストアドでアップデートからインサートまでを行うようにしてはどうでしょうか。
引数にstock_ordersテーブルの各列を持ち、nullでその列はアップデートしないみたいなことにすれば、同一値でも判断出来るのではないでしょうか。

投稿2019/09/04 10:02

YAmaGNZ

総合スコア10258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

milkwalking

2019/09/05 02:20

コメントありがとうございます。 ストアドを使用する機会がなくおっしゃている意味を理解できなかったのですが、勉強する機会をいただいたと思い、ベストアンサーにさせていただきます。
guest

0

当初の仕様では「warehouses_id列の値が同じ値でもUPDATEされたときのみINSERTしたい」
でしたが今日の朝「warehouses_id列の値が変更されたときのみINSERTしたい」に仕様変更になりました。そのうえで実装した内容記載いたします。

アップデートされた際に過去の値とアップデートされた値を比較して、そのテーブルが存在する場合に処理を行うことで目的の処理を行うことができました。

SQL

1USE [内緒] 2GO 3/****** Object: Trigger [dbo].[ct_stock_orders_update] Script Date: 2019/09/05 11:17:13 ******/ 4SET ANSI_NULLS ON 5GO 6SET QUOTED_IDENTIFIER ON 7GO 8ALTER TRIGGER[dbo].[ct_stock_orders_update] 9ON [dbo].[stock_orders] 10AFTER UPDATE 11AS 12BEGIN 13 SET NOCOUNT ON; 14 IF EXISTS (SELECT i.id 15 FROM inserted AS i INNER JOIN deleted AS d ON d.id = i.id 16 WHERE ISNULL(i.warehouses_id,-1) != ISNULL(d.warehouses_id,-1) 17 ) 18 BEGIN 19INSERT INTO c_stock_orders 20(stock_orders_id,insert_at) 21 SELECT id, GETDATE() 22 FROM inserted; 23 END 24END 25

投稿2019/09/05 02:18

milkwalking

総合スコア60

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問