Я копался в базе данных 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
этого столбца.Например:
Возвращает что-то похожее на:
Точно так же можно использовать
$IDENTITY
для таблиц, которые имеютIDENTITY
столбец.источник