Qual é o objetivo de uma coluna Row_GUID?

18

Venho pesquisando no banco de dados AdventureWorks2012 e veja Row_GUID usado em várias tabelas.

Existem duas partes na minha pergunta:

Quando devo incluir uma coluna Row_GUID?

Quais são os usos e benefícios de uma coluna Row_GUID?

SQLSuperHero
fonte

Respostas:

25

ROWGUIDCOLé usado principalmente para replicação MERGE e também é necessárioFILESTREAM , mas pode ser usado em qualquer cenário em que você queira uma coluna imutável separada da chave primária (por exemplo, no caso em que um valor de chave primária possa ser alterado, mas você ainda queira capaz de dizer qual linha era qual antes e depois da alteração).

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;

Agora, se a replicação, ou seu aplicativo, ou o que você está prestando atenção, ele notará que:

insira a descrição da imagem aqui

Veja aqui , aqui e a seção "Considerações sobre instantâneos" aqui para obter mais informações.

Aaron Bertrand
fonte
A adição de um ROWGUIDCOLUMN às tabelas que estão sendo replicadas garante que o mecanismo de replicação possa usar o campo ROWGUIDCOLUMN para diferenciar os registros com os mesmos valores de chave primária. - Rich Turner - stackoverflow.com/questions/4443036/…
Yevgraf Andreyevich Zhivago 8/16
1
@YevgrafAndreyevichZhivago Como duas linhas podem ter os mesmos valores de chave primária? Você quis dizer chaves candidatas (mas também não definidas explicitamente )?
Aaron Bertrand
13

Marcar uma coluna como ROWGUIDCOLpermite que ela seja referenciada $ROWGUIDem consultas. Isso permite tornar as consultas mais genéricas, já que você não precisa procurar, em cada tabela, qual é a coluna "única" (isso é bastante útil para recursos como Replication e FileStream, conforme observado por @Aaron e @Martin, respectivamente ) Você pode ter uma consulta construída na camada do aplicativo, ou mesmo no Dynamic SQL, que faz algo como SELECT $ROWGUID AS [ID] FROM {table_name}e simplesmente itera sobre uma lista de tabelas.

Lembre-se de que a ROWGUIDCOLdesignação não impõe exclusividade. Você ainda precisará aplicá-lo por meio de uma chave primária, um índice exclusivo ou uma restrição exclusiva. Essa opção também não impõe que a coluna seja imutável. Para isso, você precisaria de AFTER UPDATEpermissões DENY UPDATEno nível da coluna ou no gatilho para essa coluna.

Por exemplo:

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;

Retorna algo semelhante a:

@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

Da mesma forma, pode-se usar $IDENTITYpara tabelas que possuem uma IDENTITYcoluna.

Solomon Rutzky
fonte