0

如果表中的某个值发生更改,我需要从 SQL 数据库中的 select 语句中提取一行。

例如,我有一个在表中调用price的列Price。如果用户更改price(通过 asp.net 应用程序)的值,我想选择整行。这将在工作流中完成,并向用户发送一封电子邮件,说明在更改后更改的行。

这有意义吗?有人可以指出我要使用的程序或功能的正确方向吗?谢谢。

4

3 回答 3

1

您可以使用 SQL 触发器来完成此操作。

有一个教程(使用您所描述的价格)显示如何在此处完成此操作:http: //benreichelt.net/blog/2005/12/13/making-a-trigger-fire-on-column-change/

于 2012-08-06T19:55:16.680 回答
0

好吧,为了更新一行,您必须更新该行“WHERE uniqueID = [someid]”。您不能在那之后立即运行选择吗?(SELECT * FROM [table] WHERE uniquueID = [someid])

于 2012-08-06T19:53:47.813 回答
0

在不知道您的数据是什么样子的情况下(或者这是什么数据库,这有点困难),但假设您有一个历史表,其中的日期和 ID 保持不变......

+----+-------+------------+
| ID | PRICE | CHNG_DATE  |
+----+-------+------------+
|  1 | 2.5   | 2001-01-01 |
|  1 | 42    | 2001-01-01 |
|  2 | 4     | 2001-01-01 |
|  2 | 4     | 2001-01-01 |
|  3 | 4     | 2001-01-01 |
|  3 | 3     | 2001-01-01 |
|  3 | 2     | 2001-01-01 |
+----+-------+------------+

并且您的数据库支持With并且Row_number您可以编写以下内容

WITH data 
     AS (SELECT id, 
                price, 
                chng_date, 
                Row_number() 
                  OVER ( 
                    partition BY id 
                    ORDER BY chng_date) rn 
         FROM   price) 
SELECT data.id, 
       data.price     new, 
       data_prv.price old, 
       data.chng_date 
FROM   data 
       INNER JOIN data data_prv 
               ON data.id = data_prv.id 
                  AND data.rn = data_prv.rn + 1 
WHERE  data.price <> data_prv.price 

那会产生这个

+----+-----+-----+------------+
| ID | NEW | OLD | CHNG_DATE  |
+----+-----+-----+------------+
|  1 |  42 | 2.5 | 2001-01-01 |
|  3 |   3 | 4   | 2001-01-01 |
|  3 |   2 | 3   | 2001-01-01 |
+----+-----+-----+------------+

演示

如果您的数据库支持LAG()它更容易

WITH data 
     AS (SELECT id, 
                price                   new, 
                chng_date, 
                Lag(price) 
                  OVER ( 
                    partition BY id 
                    ORDER BY chng_date) old 
         FROM   price) 
SELECT id, 
       new, 
       old, 
       chng_date 
FROM   data 
WHERE  new <> old

演示

于 2012-08-06T20:14:45.673 回答