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?
fuente
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?
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 unAFTER UPDATE
disparador o permisos de nivel de columna paraDENY UPDATE
esa columna.Por ejemplo:
Devuelve algo similar a:
Del mismo modo, uno podría usar
$IDENTITY
para tablas que tienen unaIDENTITY
columna.fuente