Row_GUID sütununun amacı nedir?


18

AdventureWorks2012 veritabanında dolaşıyorum ve birkaç tabloda kullanılan Row_GUID'yi görüyorum.

Sorumun 2 bölümü var:

Ne zaman bir Row_GUID sütunu eklemeliyim?

Row_GUID sütununun yararları ve yararları nelerdir?

Yanıtlar:


25

ROWGUIDCOLöncelikle MERGE çoğaltması için kullanılır ve aynı zamanda zorunludurFILESTREAM , ancak birincil anahtardan ayrı olarak değiştirilemez bir sütun istediğiniz herhangi bir senaryoda kullanılabilir (örneğin, birincil anahtar değerinin değişebileceği, ancak yine de değişiklikten önce ve sonra hangi satırın olduğunu söyleyebilir).

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;

Şimdi, çoğaltma veya uygulamanız veya neye dikkat ediyorsanız, şunu fark edecektir:

resim açıklamasını buraya girin

Bkz burada , burada ve "Anlık Hususlar" bölümünde burada daha fazla bilgi için.


Çoğaltılan tablolara bir ROWGUIDCOLUMN eklemek, çoğaltma altyapısının aynı birincil anahtar değerlerine sahip kayıtları ayırt etmek için ROWGUIDCOLUMN alanını kullanabilmesini sağlar. - Rich Turner - stackoverflow.com/questions/4443036/…
Yevgraf Andreyevich Zhivago

2
@YevgrafAndreyevichZhivago İki sıra aynı birincil anahtar değerlerine nasıl sahip olabilir? Aday (ama açıkça tanımlanmamış ) anahtarlar mı demek istediniz ?
Aaron Bertrand

13

Bir sütunu sorgularda ROWGUIDCOLbaşvurulmasına izin verecek şekilde işaretleme $ROWGUID. Bu, her tablo için "benzersiz" sütunun ne olduğunu aramanız gerekmeyeceğinden sorguları daha genel hale getirmenize olanak tanır (sırasıyla @Aaron ve @Martin tarafından not edildiği gibi Çoğaltma ve FileStream gibi özellikler için oldukça kullanışlıdır. ). Uygulama katmanında veya Dinamik SQL'de bile, SELECT $ROWGUID AS [ID] FROM {table_name}bir tablo listesi gibi ve basitçe yinelenen bir şey yapan bir sorgu oluşturabilirsiniz .

Sadece akılda tutmak ROWGUIDCOLtanımı yok değil benzersizliği zorlamak. Yine de Birincil Anahtar, Benzersiz bir Dizin veya Benzersiz bir Kısıtlama yoluyla zorunlu tutmanız gerekecektir. Bu seçenek, sütunun değişmez olduğunu da zorlamaz. Bunun için bu AFTER UPDATEsütunda bir Tetikleyici veya sütun düzeyinde izinlere ihtiyacınız olacaktır DENY UPDATE.

Örneğin:

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;

Şuna benzer bir şey döndürür:

@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

Benzer şekilde, $IDENTITYbir IDENTITYsütunu olan tablolar için de kullanılabilir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.