私はAdventureWorks2012データベースを掘り下げて調べており、Row_GUIDがいくつかのテーブルで使用されているのを確認しています。
私の質問には2つの部分があります。
Row_GUID列はいつ含める必要がありますか?
Row_GUID列の用途と利点は何ですか?
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;
これで、レプリケーション、アプリケーション、または何に注意を払っているのかがわかると、次のことがわかります。
列を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
を使用できます。