2014-06-25 27 views
2

我有兩個表格(Users,DeletedUsers)和一個觸發器Users_Delete。刪除用戶記錄時,我想在DeletedUsers表中存儲該ID和最後一個rowversion值(在刪除之前)。如何在已有rowversion列的表中存儲rowversion值?

由於SQL不允許在表上使用rowversion類型的多列,因此我應該如何將LastUserVersion存儲在DeletedUsers表中?我應該使用哪種數據類型?

示例代碼:

CREATE TABLE [dbo].[Users] (
    [ID] [uniqueidentifier] NOT NULL, 
    [Name] [nvarchar](100) NOT NULL, 
    [Version] [rowversion] NOT NULL 
) 

CREATE TABLE [dbo].[DeletedUsers] (
    [ID] [uniqueidentifier] NOT NULL, 
    [LastUserVersion] [rowversion] NOT NULL, -- ERROR 
    [Version] [rowversion] NOT NULL 
) 

CREATE TRIGGER [dbo].[Users_Delete] ON [dbo].[Users] 
    AFTER DELETE 
    AS 
    BEGIN 
    SET NOCOUNT ON 

    INSERT INTO [dbo].[DeletedUsers] 
    (
     ObjectID, 
     LastUserVersion 
    ) 
    SELECT 
     ObjectID, 
     Version 
    FROM DELETED 
    SET NOCOUNT OFF 
    END 

回答

3

如何存放在一個已經有 rowversion列的表rowversion值?

根據MSDN

甲非空rowversion列在語義上等同於一個 二進制(8)柱。可空的rowversion列在語義上等效於varbinary(8)列 。

因爲[rowversion]列的定義是[Version] [rowversion] NOT NULL您可以使用BINARY(8)

1

我真的沒有看到保留已刪除行的rowversion的一點。此外,您不僅限於每個表的一個rowversion列,您也不允許插入或更新該列。

也就是說,rowversion是Binary(8),所以你可以使用它。基本上,它是一個數字,所以你可以將它轉換爲一個可能更方便的整數。對於8字節,您將需要bigint。

+0

假設我在CarOwners和Cars之間有一對多的關係。我想檢索所有'CarOwners',其集合'Cars'在特定的rowversion值後發生了變化(修改,插入,刪除)。如果沒有將'Car'的最後一行存儲在已刪除的表中,那麼'CarOwner'將被排除在結果集之外,如果這是對其集合的唯一更改。 –

+0

嗯..現在我想我不需要它。沒有合理的場景,「DeletedUsers」記錄上的rowversion值會再次遞增,因此我只能使用該表上已存在的rowversion值。 –

+0

是的,這就是爲什麼我想知道你爲什麼要保留它。 –

相關問題