Row_GUID列の目的は何ですか?


18

私はAdventureWorks2012データベースを掘り下げて調査し、いくつかのテーブルでRow_GUIDが使用されていることを確認しました。

私の質問には2つの部分があります。

Row_GUID列を含める必要があるのはいつですか?

Row_GUID列の用途と利点は何ですか?

回答:


25

ROWGUIDCOL主にMERGEレプリケーションに使用され、にも必要ですがFILESTREAM、プライマリキーとは別の不変列が必要なシナリオで使用できます(たとえば、プライマリキーの値を変更できるが、それでも変更前と変更後の行を区別できます)。

USE tempdb;
GO

CREATE TABLE dbo.example
(
  name sysname PRIMARY KEY, 
  rowguid uniqueidentifier NOT NULL DEFAULT NEWID() ROWGUIDCOL
);

INSERT dbo.example(name) VALUES(N'bob'),(N'frank');

SELECT * FROM dbo.example;

UPDATE dbo.example SET name = N'pat' WHERE name = N'bob';
UPDATE dbo.example SET name = N'bob' WHERE name = N'frank';

SELECT * FROM dbo.example;

DROP TABLE dbo.example;

レプリケーション、アプリケーション、または何に注意を払っていれば、次のことがわかります。

ここに画像の説明を入力してください

参照してください。ここでここでは、および「スナップショットの注意事項」を参照し、ここで詳細は。


複製されるテーブルにROWGUIDCOLUMNを追加すると、複製エンジンがROWGUIDCOLUMNフィールドを使用して、同じ主キー値を持つレコードを区別できるようになります。-リッチ・ターナー- stackoverflow.com/questions/4443036/...
Yevgraf Andreyevich Zhivago

1
@YevgrafAndreyevichZhivago 2つの行が同じ主キー値を持つ方法 候補(ただし、明示的に定義されていない)キーを意味しましたか?
アーロンバートランド

13

列にマークを付けると、クエリROWGUIDCOLで参照できるようになります$ROWGUID。これにより、各テーブルごとに「一意」列を検索する必要がないため、クエリをより汎用的にすることができます(これは、それぞれ@Aaronと@Martinで説明されているReplicationとFileStreamなどの機能に非常に役立ちます) )。アプリレイヤー、または動的SQLでクエリを作成し、SELECT $ROWGUID AS [ID] FROM {table_name}テーブルのリストを繰り返し処理することができます。

ROWGUIDCOL指定は一意性を強制しないことに注意してください。プライマリキー、一意のインデックス、または一意の制約を使用して、それを強制する必要があります。また、このオプションは、列が不変であることを強制しません。そのためには、そのAFTER UPDATE列に対するトリガーまたは列レベルのアクセス許可が必要DENY UPDATEです。

例えば:

SET NOCOUNT ON;
CREATE TABLE #RowGuidColTest
(
  ID UNIQUEIDENTIFIER NOT NULL DEFAULT (NEWID()) ROWGUIDCOL,
  SomeValue INT
);

INSERT INTO #RowGuidColTest (SomeValue) VALUES (12), (14), (1231);

DECLARE @Search UNIQUEIDENTIFIER;

SELECT TOP (1) @Search = $ROWGUID
FROM   #RowGuidColTest;

SELECT @Search AS [@Search]

SELECT *, $ROWGUID AS [$ROWGUID]
FROM   #RowGuidColTest;

SELECT *
FROM   #RowGuidColTest
WHERE  $ROWGUID = @Search;

-- No enforced uniqueness without a PK, Unique Index, or Unique Constraint.
UPDATE tmp
SET    $ROWGUID = @Search
FROM   #RowGuidColTest tmp

SELECT *
FROM   #RowGuidColTest
WHERE  $ROWGUID = @Search;

次のようなものを返します。

@Search
E7166D18-5003-4D20-8983-E2402472CF82


ID                                      SomeValue    $ROWGUID
E7166D18-5003-4D20-8983-E2402472CF82    12           E7166D18-5003-4D20-8983-E2402472CF82
44FD48A4-AF38-41BF-AE4E-8A12D26B5B57    14           44FD48A4-AF38-41BF-AE4E-8A12D26B5B57
2D50C5C7-1E43-4ADA-A03B-ED202FC88D20    1231         2D50C5C7-1E43-4ADA-A03B-ED202FC88D20


ID                                      SomeValue
E7166D18-5003-4D20-8983-E2402472CF82    12


ID                                      SomeValue
E7166D18-5003-4D20-8983-E2402472CF82    12
E7166D18-5003-4D20-8983-E2402472CF82    14
E7166D18-5003-4D20-8983-E2402472CF82    1231

同様に、列$IDENTITYを持つテーブルにも使用できIDENTITYます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.