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?
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?
Jawaban:
ROWGUIDCOL
terutama 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:
Lihat di sini , di sini , dan bagian "Pertimbangan Foto" di sini untuk info lebih lanjut.
Menandai kolom yang ROWGUIDCOL
memungkinkan direferensikan melalui $ROWGUID
kueri. 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 ROWGUIDCOL
penunjukan 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 UPDATE
izin atau tingkat kolom Pemicu untuk DENY UPDATE
pada 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 $IDENTITY
untuk tabel yang memiliki IDENTITY
kolom.