Я копался в базе данных 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
запросы. Это позволяет сделать запросы более общими, так как вам не нужно искать по каждой таблице, что такое «уникальный» столбец (это весьма полезно для таких функций, как Replication и FileStream, как отмечали @Aaron и @Martin соответственно ). Вы можете создать запрос на уровне приложения или даже в Dynamic SQL, который выполняет что-то вроде SELECT $ROWGUID AS [ID] FROM {table_name}
и просто перебирает список таблиц.
Просто имейте в виду, что ROWGUIDCOL
обозначение не навязывает уникальность. Вам все еще нужно будет применять его с помощью первичного ключа, уникального индекса или уникального ограничения. Также этот параметр не гарантирует, что столбец является неизменным. Для этого вам понадобятся разрешения AFTER UPDATE
Trigger или уровня столбца для 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
столбец.