Ho cercato nel database AdventureWorks2012 e ho visto Row_GUID utilizzato in diverse tabelle.
Ci sono 2 parti della mia domanda:
Quando devo includere una colonna Row_GUID?
Quali sono gli usi e i vantaggi di una colonna Row_GUID?
Ho cercato nel database AdventureWorks2012 e ho visto Row_GUID utilizzato in diverse tabelle.
Ci sono 2 parti della mia domanda:
Quando devo includere una colonna Row_GUID?
Quali sono gli usi e i vantaggi di una colonna Row_GUID?
Risposte:
ROWGUIDCOL
viene utilizzato principalmente per la replica MERGE ed è anche richiesto perFILESTREAM
, ma può essere utilizzato in qualsiasi scenario in cui si desidera una colonna immutabile separata dalla chiave primaria (ad esempio nel caso in cui un valore della chiave primaria possa cambiare, ma si desidera comunque essere in grado di dire quale riga era quale prima e dopo il cambiamento).
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;
Ora, se la replica, o la tua applicazione o cosa stai prestando attenzione, noterà che:
Vedi qui , qui , e la sezione "Considerazioni sull'istantanea" qui per maggiori informazioni.
Contrassegnare una colonna come ROWGUIDCOL
consente di fare riferimento a $ROWGUID
nelle query. Ciò consente di rendere le query più generiche poiché non è necessario cercare, per ogni tabella, qual è la colonna "unica" (questo è abbastanza utile per funzionalità come Replication e FileStream come notato rispettivamente da @Aaron e @Martin ). Potresti avere una query costruita nel livello dell'app, o anche in Dynamic SQL, che fa qualcosa di simile SELECT $ROWGUID AS [ID] FROM {table_name}
e scorre semplicemente su un elenco di tabelle.
Basta tenere presente che la ROWGUIDCOL
designazione non impone l'unicità. Sarà comunque necessario imporlo tramite una chiave primaria, un indice univoco o un vincolo univoco. Né questa opzione impone che la colonna sia immutabile. Per questo sarebbe necessario un AFTER UPDATE
trigger o autorizzazioni a livello di DENY UPDATE
colonna su quella colonna.
Per esempio:
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;
Restituisce qualcosa di simile 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
Allo stesso modo, si potrebbe usare $IDENTITY
per le tabelle che hanno una IDENTITY
colonna.