在将表分区为多个磁盘时保留timepan列的数据

时间:2013-04-09 11:32:30

标签: sql sql-server partitioning

我需要将表分区为多个磁盘上的多个文件。下面是创建表。

我们面临的挑战是,在对这个巨大的表进行分区时,ts时间戳数据将会丢失(将被覆盖到新的时间戳)。我怎么能避免这种情况?

CREATE TABLE [dbo].[Audit](

       [Id] [uniqueidentifier] NOT NULL,

       [ObjectName] [varchar](150) NOT NULL,

       [IUD] [varchar](1) NOT NULL,

       [ts] [timestamp] NULL,

       [username] [varchar](150) NOT NULL,

       [IP] [varchar](50) NULL,

       [MAC] [varchar](50) NULL,

       [ChangeSet] [xml] NULL,

       [Key1] [varchar](50) NULL,

       [Key2] [varchar](50) NULL,

       [Date] [datetime] NULL,

CONSTRAINT [PK_Audith] PRIMARY KEY CLUSTERED

(

       [Id] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

1 个答案:

答案 0 :(得分:0)

简短的回答是你无法写入时间戳。顺便说一句,rowversion是新类型,时间戳已被弃用。如果您使用的是支持新类型的版本,则应该这样做。

如果您确实需要保留旧的rowversion,可以将其保存在varbinary列中。但是,您不知道自转换以来该行是否已更新。我想你可以在表上设置一个触发器,在转换后将更新的旧时间戳为NULL。然后你可以在ISNULL(OLD_TS,TS)上有一个计算列。由您来决定单独列的额外开销和存储是否值得。

您还可以在转换时将新时间戳存储在单独的表中。您不能将它放在同一个表中,因为更新后的触发器会增加时间戳,从而无法存储原始时间戳的目的。并且在一个而不是触发器上插入的伪卷中没有rowversion(至少在2008 v2中,我已经尝试过了)。但是,这意味着一个连接,如果你正在进行分区,我怀疑我们正在谈论一个大型数据集。所以我更多地包含这个来警告你不要试图通过触发器在表格中存储转换。