Qual è lo scopo di una colonna Row_GUID?


18

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:


25

ROWGUIDCOLviene 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:

inserisci qui la descrizione dell'immagine

Vedi qui , qui , e la sezione "Considerazioni sull'istantanea" qui per maggiori informazioni.


L'aggiunta di un ROWGUIDCOLUMN alle tabelle replicate garantisce che il motore di replica possa utilizzare il campo ROWGUIDCOLUMN per differenziare i record con gli stessi valori di chiave primaria. - Rich Turner - stackoverflow.com/questions/4443036/...
Yevgraf Andreyevich Zivago

2
@YevgrafAndreyevichZhivago Come possono due righe avere gli stessi valori di chiave primaria? Intendevi chiavi candidate (ma anche non definite in modo esplicito )?
Aaron Bertrand

13

Contrassegnare una colonna come ROWGUIDCOLconsente di fare riferimento a $ROWGUIDnelle 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 ROWGUIDCOLdesignazione 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 UPDATEtrigger o autorizzazioni a livello di DENY UPDATEcolonna 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 $IDENTITYper le tabelle che hanno una IDENTITYcolonna.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.