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?
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?
Respostas:
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:
Veja aqui , aqui e a seção "Considerações sobre instantâneos" aqui para obter mais informações.
Marcar uma coluna como ROWGUIDCOL
permite que ela seja referenciada $ROWGUID
em 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 ROWGUIDCOL
designaçã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 UPDATE
permissões DENY UPDATE
no 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 $IDENTITY
para tabelas que possuem uma IDENTITY
coluna.