Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何跟踪SQL Server中记录的更改?_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

如何跟踪SQL Server中记录的更改?

如何跟踪SQL Server中记录的更改?,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,下表列出了所有学生的跟踪记录 |==========================================| | ID | Department | Date | |==========================================| | 001 | English | Feb 3 2017 | | 001 | English | Feb 4 2017 | | 001

下表列出了所有学生的跟踪记录

|==========================================|
| ID      |  Department     | Date         |
|==========================================|
| 001     | English         | Feb 3 2017   |
| 001     | English         | Feb 4 2017   |
| 001     | Science         | Mar 1 2017   |
| 001     | Science         | Apr 2 2017   |
| 001     | Maths           | Apr 7 2017   |
| 002     | Maths           | Feb 1 2017   |
| 002     | Maths           | Apr 7 2017   |
| 003     | Maths           | Apr 3 2017   |
| 004     | Science         | Feb 1 2017   |
| 004     | Maths           | Apr 7 2017   |
|==========================================| 
就在学生换系之前,我需要取以前的记录。对于上面的示例,返回的记录集应该是

对于001,

| 001     | English         | Feb 4 2017   |
| 001     | Science         | Apr 2 2017   |
用于002和003

不变

对于004

| 004     | Science         | Feb 1 2017   |

也有可能同一用户可以更改回同一部门。例如,user001可以从a部门更改为b部门,再更改为c部门,再更改为a部门。我读过关于T-SQL发送和接收的文章。但不确定这在这种情况下是否有帮助。请提供帮助。

这可以通过在需要跟踪的表上创建插入/更新后触发器来完成。使用sql server中插入/删除的逻辑表,可以跟踪表上新插入和修改的字段

插入(逻辑表):它将为您提供新插入记录/更新值(列值)的详细信息


已删除(逻辑表):它将在字段被修改/删除之前为您提供字段的旧值。

一种方法是使用带分区的
行数
函数来检测
部门
列的值何时更改

样本数据

DECLARE @T TABLE (ID int, Department nvarchar(100), dt date);
INSERT INTO @T (ID, Department, dt) VALUES
(1, 'English', 'Feb 3 2017'),
(1, 'English', 'Feb 4 2017'),
(1, 'Science', 'Mar 1 2017'),
(1, 'Science', 'Apr 2 2017'),
(1, 'Maths  ', 'Apr 7 2017'),
(2, 'Maths  ', 'Feb 1 2017'),
(2, 'Maths  ', 'Apr 7 2017'),
(3, 'Maths  ', 'Apr 3 2017'),
(4, 'Science', 'Feb 1 2017'),
(4, 'Maths  ', 'Apr 7 2017');
查询

WITH
CTE
AS
(
    SELECT
        ID
        ,Department
        ,dt
        ,ROW_NUMBER() OVER (PARTITION BY ID, Department ORDER BY dt DESC) AS rnPart
        ,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY dt DESC) AS rnID
    FROM @T
)
SELECT
    ID
    ,Department
    ,dt
FROM CTE
WHERE
    rnPart = 1
    AND rnID <> 1
ORDER BY
    ID
    ,dt
;

我对此不是很确定,但您可以在存储过程的概念方面获得帮助。它们是数据库的一部分。您可以在查询时设置显示

SQL Server的版本是什么?我不明白;是要查询表以查找这些记录,还是要在插入或更新后立即获取这些记录?@GiorgosAltanis每当部门在历史记录中发生更改时,都必须获取记录集。和001一样,该系已从英语科学系改为英语科学系,日期为2月4日。同样,他也从科学-数学改为4月4日。这适用于所有人IDs@VladimirBaranov版本是2012So,现在您有了答案,关于发送和接收是什么?重命名为
dt
to
date
,以匹配Poppy的列名。干得好@乔治萨尔塔尼斯,这只是一个例子。我不喜欢在列名中使用保留字。我理解(并且同意)。当我编辑你的答案时,你还没有提供示例代码,所以我想确保OP明白这个解决方案是有效的。@VladimirBaranov如果学生从A系(过去)再次转到A系,分区会如何工作。@Poppy,你是说从A到B,然后从B回到A,然后再到C?在这种情况下,我的查询将只返回A的最后一个日期。它不会返回带A的两行。我认为,如果您问另一个问题,并使用涵盖所有重要案例的更广泛的样本数据,会更好。如果我没有弄错的话,这个问题会很不一样,也会更复杂。
+----+------------+------------+
| ID | Department |     dt     |
+----+------------+------------+
|  1 | English    | 2017-02-04 |
|  1 | Science    | 2017-04-02 |
|  4 | Science    | 2017-02-01 |
+----+------------+------------+