web-dev-qa-db-ja.com

Row_GUID列の目的は何ですか?

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

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

Row_GUID列はいつ含める必要がありますか?

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

18
SQLSuperHero

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;

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

enter image description here

詳細については、 ここここ 、および「スナップショットに関する考慮事項」セクション ここ を参照してください。

25
Aaron Bertrand

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

ROWGUIDCOL指定はnotが一意性を強制することを覚えておいてください。それでも、主キー、一意のインデックス、または一意の制約を介してそれを適用する必要があります。このオプションでは、列が不変であることも強制されません。そのためには、その列の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を使用できます。

14
Solomon Rutzky