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?
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?
Respuestas:
ROWGUIDCOL
se 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:
Consulte aquí , aquí y la sección "Consideraciones de instantáneas" aquí para obtener más información.
Marcar una columna como ROWGUIDCOL
permite hacer referencia a ella mediante $ROWGUID
consultas. 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 ROWGUIDCOL
designació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 UPDATE
disparador o permisos de nivel de columna para DENY UPDATE
esa 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 $IDENTITY
para tablas que tienen una IDENTITY
columna.