Яке призначення стовпця Row_GUID?


18

Я копав у базі даних AdventureWorks2012 і бачу Row_GUID, який використовується у кількох таблицях.

У моєму питанні є дві частини:

Коли я повинен включати стовпець Row_GUID?

Які переваги та переваги стовпця Row_GUID?

Відповіді:


25

ROWGUIDCOLв основному використовується для реплікації MERGE , а також необхідна дляFILESTREAM , але може бути використана в будь-якому сценарії, де потрібно незмінний стовпчик окремо від первинного ключа (наприклад, у випадку, коли значення первинного ключа може змінитися, але ви все ще хочете бути вміти розповісти, який рядок був, який був до та після зміни).

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;

Тепер, якщо на реплікацію чи вашу програму чи на що ви звернете увагу, ви помітите, що:

введіть тут опис зображення

Дивіться тут , тут , і розділ "Розгляд знімків" тут для отримання додаткової інформації.


Додавання ROWGUIDCOLUMN до реплікаційних таблиць гарантує, що механізм реплікації може використовувати поле ROWGUIDCOLUMN для розмежування записів з однаковими значеннями первинного ключа. - Багатий Тернер - stackoverflow.com/questions/4443036/…
Євграф Андрійович Живаго

2
@YevgrafAndreyevichZhivago Як могли два рядки мати однакові значення первинного ключа? Ви мали на увазі кандидатські (але також не чітко визначені ) ключі?
Аарон Бертран

13

Позначення стовпця як ROWGUIDCOLдозволяє посилатися на нього $ROWGUIDв запитах. Це дозволяє робити запити більш загальними, оскільки вам не потрібно буде шукати в кожній таблиці, що таке "унікальний" стовпець (це цілком корисно для таких функцій, як Replication і FileStream, як зазначають @Aaron та @Martin відповідно ). Ви можете створити запит на рівні додатків або навіть у Dynamic SQL, який робить щось на кшталт SELECT $ROWGUID AS [ID] FROM {table_name}і просто перебирає список таблиць.

Тільки майте на увазі, що ROWGUIDCOLпозначення цього немає нав'язує унікальності. Вам все одно потрібно буде застосувати це за допомогою Первинного ключа, Унікального індексу або Унікального обмеження. Також ця опція не примушує, що стовпчик є незмінним. Для цього вам знадобляться або AFTER UPDATEтригерні, або дозволи на рівні стовпця для DENY UPDATEцього стовпця.

Наприклад:

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;

Повертає щось подібне до:

@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

Аналогічно можна використовувати $IDENTITYдля таблиць із IDENTITYстовпчиком.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.