Was ist der Zweck einer Row_GUID-Spalte?


18

Ich habe in der AdventureWorks2012-Datenbank herumgebuddelt und festgestellt, dass Row_GUID in mehreren Tabellen verwendet wird.

Meine Frage besteht aus 2 Teilen:

Wann sollte ich eine Row_GUID-Spalte einfügen?

Was sind die Verwendungen und Vorteile einer Row_GUID-Spalte?

Antworten:


25

ROWGUIDCOLwird hauptsächlich für die MERGE-Replikation verwendet und ist auch für erforderlichFILESTREAM , kann jedoch in jedem Szenario verwendet werden, in dem eine unveränderliche Spalte vom Primärschlüssel getrennt werden soll (z. B. in dem Fall, in dem sich ein Primärschlüsselwert ändern kann, Sie dies aber dennoch möchten) in der Lage zu erkennen, welche Zeile vor und nach der Änderung welche war).

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;

Wenn die Replikation oder Ihre Anwendung oder was Sie beachten, wird Folgendes festgestellt:

Bildbeschreibung hier eingeben

Sehen Sie hier , hier , und der „Snapshot Überlegungen“ Abschnitt hier für weitere Informationen.


Durch Hinzufügen eines ROWGUIDCOLUMN zu den zu replizierenden Tabellen wird sichergestellt, dass das Replikationsmodul mithilfe des ROWGUIDCOLUMN-Felds zwischen Datensätzen mit denselben Primärschlüsselwerten unterscheiden kann. - Rich Turner - stackoverflow.com/questions/4443036/…
Jewgraf Andrejewitsch Schiwago

1
@YevgrafAndreyevichZhivago Wie können zwei Zeilen dieselben Primärschlüsselwerte haben? Meinst Du Kandidaten (aber auch nicht explizit definiert ) Schlüssel?
Aaron Bertrand

13

Durch Markieren einer Spalte als ROWGUIDCOLkann $ROWGUIDin Abfragen auf sie verwiesen werden. Auf diese Weise können Sie Abfragen generischer gestalten, da Sie nicht für jede Tabelle nachsehen müssen, was die "eindeutige" Spalte ist (dies ist sehr nützlich für Funktionen wie Replication und FileStream, wie von @Aaron bzw. @Martin angegeben) ). Sie könnten eine Abfrage in der App-Ebene oder sogar in Dynamic SQL erstellen lassen, die so etwas wie SELECT $ROWGUID AS [ID] FROM {table_name}eine Liste von Tabellen ausführt und diese einfach durchläuft.

Denken Sie daran , dass die ROWGUIDCOLBezeichnung nicht nicht Eindeutigkeit erzwingen. Sie müssen dies weiterhin über einen Primärschlüssel, einen eindeutigen Index oder eine eindeutige Einschränkung erzwingen. Diese Option erzwingt auch nicht, dass die Spalte unveränderlich ist. Dafür benötigen Sie entweder einen AFTER UPDATETrigger oder Berechtigungen DENY UPDATEauf Spaltenebene für diese Spalte.

Beispielsweise:

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;

Gibt etwas Ähnliches zurück wie:

@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

Ebenso könnte man $IDENTITYfür Tabellen verwenden, die eine IDENTITYSpalte haben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.