Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/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 2005 SQL Server中使用哪种类型作为可写时间戳?_Sql Server 2005 - Fatal编程技术网

Sql server 2005 SQL Server中使用哪种类型作为可写时间戳?

Sql server 2005 SQL Server中使用哪种类型作为可写时间戳?,sql-server-2005,Sql Server 2005,我在SQL Server中有一个表,tblMain。有一个触发器,当一行发生更改时,它基本上会从tblMain执行SELECT*并将更改的行插入tblHistory。tblHistory是tblMain的副本(只比tblMain高得多),它有一个用于唯一id的额外字段。为了避免Microsoft Access 2007中的写入冲突问题,我最近添加了一个TimeStamp类型的字段(我现在了解到该字段已被弃用,但稍后我会处理) 显然,触发器会将tblMain中的每个字段复制到tblHistory。

我在SQL Server中有一个表,tblMain。有一个触发器,当一行发生更改时,它基本上会从tblMain执行SELECT*并将更改的行插入tblHistory。tblHistory是tblMain的副本(只比tblMain高得多),它有一个用于唯一id的额外字段。为了避免Microsoft Access 2007中的写入冲突问题,我最近添加了一个TimeStamp类型的字段(我现在了解到该字段已被弃用,但稍后我会处理)


显然,触发器会将tblMain中的每个字段复制到tblHistory。它正在做一个选择*。但是,如果我在历史记录表中放入一个timeStamp类型的字段来接收来自tblMain的字段,那么触发器显然会失败。我应该在历史记录表中使用什么类型来接受时间戳源?

正在重命名
时间戳
列类型,基本上,在SQL Server 2008及更高版本中,它将被称为
ROWVERSION
——它不会消失,只是得到了一个新名称

现在,时间戳列确实是不可写的——因此,基本上,在触发器中,您需要执行一个INSERT语句,列出所有要写入的列——并省略时间戳

TIMESTAMP/ROWVERSION是您的最佳选择-只有该类型的列才能保证总是唯一的,并且在每次后续插入时总是不断增加。任何与日期相关的列都可能有重复项(在SQLServer2005中,DATETIME的精度为3.33ms,因此您肯定可以有重复项)


您可能希望结合使用时间戳以确保准确性和唯一性,以及DATETIME以确保人类可读性。时间戳由SQL Server自动处理,对于
LastModifiedDate DATETIME
,您可以定义
GETDATE()
默认约束
,以便每次插入都记录当前的日期/时间。

在触发器中,您可以这样做,它只会插入受影响的行,并且比解析原始表以查找更改的内容要快得多

INSERT INTO tblHistory
        (col1, col2, ...)
    SELECT
        col1, col2, ...
        FROM INSERTED
从文档中:

不可为空的时间戳列在语义上等价于二进制(8)列。可为空的时间戳列在语义上等价于varbinary(8)列

这项工作:

-- //Main table, with TIMESTAMP column
CREATE TABLE Main ( id INT, TIMESTAMP )

-- //Some values
INSERT Main VALUES ( 8, DEFAULT )
INSERT Main VALUES ( 4, DEFAULT )
INSERT Main VALUES ( 2, DEFAULT )
INSERT Main VALUES ( 7, DEFAULT )
INSERT Main VALUES ( 0, DEFAULT )

-- //See the values
SELECT * FROM Main

-- //History table
-- //with VARBINARY(8) to store a nullable TIMESTAMP
CREATE TABLE History (id INT, ts VARBINARY(8))

-- //Populate History table
INSERT History
SELECT * FROM Main

-- //See the values
SELECT * FROM History

我不想把列名放在触发器中,因为它们会时不时地改变,这更像是一个维护问题。如何处理从历史记录表中更改列的问题?另外,我希望您使用触发器中插入的表。感谢您提供有关如何处理此问题的信息。这确实是一个非常好的答案。谢谢