私はAdventureWorks2012データベースを掘り下げて調査し、いくつかのテーブルでRow_GUIDが使用されていることを確認しました。
私の質問には2つの部分があります。
Row_GUID列を含める必要があるのはいつですか?
Row_GUID列の用途と利点は何ですか?
私は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などの機能に非常に役立ちます) )。アプリレイヤー、または動的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
ます。