Я копав у базі даних AdventureWorks2012 і бачу Row_GUID, який використовується у кількох таблицях.
У моєму питанні є дві частини:
Коли я повинен включати стовпець Row_GUID?
Які переваги та переваги стовпця Row_GUID?
Я копав у базі даних AdventureWorks2012 і бачу Row_GUID, який використовується у кількох таблицях.
У моєму питанні є дві частини:
Коли я повинен включати стовпець Row_GUID?
Які переваги та переваги стовпця Row_GUID?
Відповіді:
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;
Тепер, якщо на реплікацію чи вашу програму чи на що ви звернете увагу, ви помітите, що:
Дивіться тут , тут , і розділ "Розгляд знімків" тут для отримання додаткової інформації.
Позначення стовпця як 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
стовпчиком.