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?
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:
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:
Bkz burada , burada ve "Anlık Hususlar" bölümünde burada daha fazla bilgi için.
Bir sütunu sorgularda ROWGUIDCOL
baş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 ROWGUIDCOL
tanı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 UPDATE
sü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, $IDENTITY
bir IDENTITY
sütunu olan tablolar için de kullanılabilir .