Apa tujuan dari kolom Row_GUID?

18

Saya telah menggali di dalam database AdventureWorks2012 dan melihat Row_GUID digunakan dalam beberapa tabel.

Ada 2 bagian untuk pertanyaan saya:

Kapan saya harus memasukkan kolom Row_GUID?

Apa kegunaan dan manfaat kolom Row_GUID?

SQLSuperHero
sumber

Jawaban:

25

ROWGUIDCOLterutama digunakan untuk replikasi MERGE , dan juga diperlukan untukFILESTREAM , tetapi dapat digunakan dalam skenario apa pun di mana Anda ingin kolom tetap terpisah dari kunci primer (misalnya dalam kasus di mana nilai kunci utama dapat berubah, tetapi Anda masih ingin menjadi dapat mengetahui baris mana yang sebelum dan sesudah perubahan).

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;

Sekarang, jika replikasi, atau aplikasi Anda, atau apa yang Anda perhatikan, itu akan melihat bahwa:

masukkan deskripsi gambar di sini

Lihat di sini , di sini , dan bagian "Pertimbangan Foto" di sini untuk info lebih lanjut.

Aaron Bertrand
sumber
Menambahkan ROWGUIDCOLUMN ke tabel yang direplikasi memastikan bahwa mesin replikasi dapat menggunakan bidang ROWGUIDCOLUMN untuk membedakan antara catatan dengan nilai kunci primer yang sama. - Rich Turner - stackoverflow.com/questions/4443036/…
Yevgraf Andreyevich Zhivago
2
@YevgrafAndreyevichZhivago Bagaimana mungkin dua baris memiliki nilai kunci primer yang sama? Apakah maksud Anda kunci kandidat (tetapi juga tidak ditentukan secara eksplisit )?
Aaron Bertrand
13

Menandai kolom yang ROWGUIDCOLmemungkinkan direferensikan melalui $ROWGUIDkueri. Ini memungkinkan untuk membuat kueri lebih umum karena Anda tidak perlu mencari, per setiap tabel, apa kolom "unik" itu (ini cukup berguna untuk fitur seperti Replikasi dan FileStream seperti yang dicatat oleh @Aaron dan @Martin, masing-masing). ). Anda bisa membuat kueri yang dibangun di lapisan aplikasi, atau bahkan dalam Dynamic SQL, yang melakukan sesuatu seperti SELECT $ROWGUID AS [ID] FROM {table_name}dan hanya mengulangi daftar tabel.

Hanya perlu diingat bahwa ROWGUIDCOLpenunjukan itu tidak menegakkan keunikan. Anda masih perlu memberlakukannya melalui Kunci Utama, Indeks Unik, atau Kendala Unik. Opsi ini juga tidak menegaskan bahwa kolom tidak dapat diubah. Untuk itu Anda perlu AFTER UPDATEizin atau tingkat kolom Pemicu untuk DENY UPDATEpada kolom itu.

Sebagai contoh:

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;

Mengembalikan sesuatu yang mirip dengan:

@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

Demikian pula, orang bisa menggunakan $IDENTITYuntuk tabel yang memiliki IDENTITYkolom.

Solomon Rutzky
sumber