¿Cuál es el propósito de una columna Row_GUID?

18

He estado buscando en la base de datos AdventureWorks2012 y veo Row_GUID utilizado en varias tablas.

Hay 2 partes en mi pregunta:

¿Cuándo debo incluir una columna Row_GUID?

¿Cuáles son los usos y beneficios de una columna Row_GUID?

SQLSuperHero
fuente

Respuestas:

25

ROWGUIDCOLse usa principalmente para la replicación de MERGE , y también se requiere paraFILESTREAM , pero se puede usar en cualquier escenario en el que desee una columna inmutable separada de la clave primaria (por ejemplo, en el caso en que un valor de clave primaria puede cambiar, pero aún así desea ser capaz de saber qué fila era cuál antes y después del cambio).

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;

Ahora, si la replicación, o su aplicación, o lo que está prestando atención, notará que:

ingrese la descripción de la imagen aquí

Consulte aquí , aquí y la sección "Consideraciones de instantáneas" aquí para obtener más información.

Aaron Bertrand
fuente
Agregar un ROWGUIDCOLUMN a las tablas que se están replicando garantiza que el motor de replicación pueda usar el campo ROWGUIDCOLUMN para diferenciar entre registros con los mismos valores de clave primaria. - Rich Turner - stackoverflow.com/questions/4443036/…
Yevgraf Andreyevich Zhivago
2
@YevgrafAndreyevichZhivago ¿Cómo podrían dos filas tener los mismos valores de clave primaria? ¿Quiso decir claves candidatas (pero tampoco definidas explícitamente )?
Aaron Bertrand
13

Marcar una columna como ROWGUIDCOLpermite hacer referencia a ella mediante $ROWGUIDconsultas. Esto permite que las consultas sean más genéricas, ya que no necesitaría buscar, para cada tabla, cuál es la columna "única" (esto es bastante útil para funciones como Replication y FileStream como lo señalan @Aaron y @Martin, respectivamente ) Podría tener una consulta construida en la capa de la aplicación, o incluso en Dynamic SQL, que hace algo así SELECT $ROWGUID AS [ID] FROM {table_name}y simplemente itera sobre una lista de tablas.

Solo tenga en cuenta que la ROWGUIDCOLdesignación no impone la unicidad. Aún tendrá que aplicarlo a través de una Clave primaria, un Índice único o una Restricción única. Esta opción tampoco exige que la columna sea inmutable. Para eso, necesitaría un AFTER UPDATEdisparador o permisos de nivel de columna para DENY UPDATEesa columna.

Por ejemplo:

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;

Devuelve algo similar 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

Del mismo modo, uno podría usar $IDENTITYpara tablas que tienen una IDENTITYcolumna.

Solomon Rutzky
fuente