Какова цель столбца Row_GUID?

18

Я копался в базе данных AdventureWorks2012 и вижу, что Row_GUID используется в нескольких таблицах.

На мой вопрос есть 2 части:

Когда я должен включить столбец Row_GUID?

Каковы преимущества и преимущества столбца Row_GUID?

SQLSuperHero
источник

Ответы:

25

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;

Теперь, если репликация, или ваше приложение, или то, на что вы обращаете внимание, заметит, что:

введите описание изображения здесь

Смотрите здесь , здесь , и раздел «Соображения снимка» здесь для получения дополнительной информации.

Аарон Бертран
источник
Добавление ROWGUIDCOLUMN к реплицируемым таблицам гарантирует, что механизм репликации может использовать поле ROWGUIDCOLUMN для различения записей с одинаковыми значениями первичного ключа. - Рич Тернер - stackoverflow.com/questions/4443036/…
Евграф Андреевич Живаго
2
@YevgrafAndreyevichZhivago Как две строки могут иметь одинаковые значения первичного ключа? Вы имели в виду ключи- кандидаты (но также не определены явно )?
Аарон Бертран
13

Пометка столбца как ROWGUIDCOLпозволяет ссылаться на него через $ROWGUIDзапросы. Это позволяет сделать запросы более общими, так как вам не нужно искать по каждой таблице, что такое «уникальный» столбец (это весьма полезно для таких функций, как Replication и FileStream, как отмечали @Aaron и @Martin соответственно ). Вы можете создать запрос на уровне приложения или даже в Dynamic SQL, который выполняет что-то вроде SELECT $ROWGUID AS [ID] FROM {table_name}и просто перебирает список таблиц.

Просто имейте в виду, что ROWGUIDCOLобозначение не навязывает уникальность. Вам все еще нужно будет применять его с помощью первичного ключа, уникального индекса или уникального ограничения. Также этот параметр не гарантирует, что столбец является неизменным. Для этого вам понадобятся разрешения AFTER UPDATETrigger или уровня столбца для 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столбец.

Соломон Руцкий
источник