0

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

我们面临的挑战是,在对这个巨大的表进行分区时,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]
4

1 回答 1

0

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

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

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

于 2013-04-09T14:25:01.640 回答