我一直在 AdventureWorks2012 数据库中挖掘并看到在几个表中使用的 Row_GUID。
我的问题有两个部分:
何时应该包含 Row_GUID 列?
Row_GUID 列的用途和好处是什么?
Aar*_*and 26
ROWGUIDCOL
主要用于MERGE replication,也需要用于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;
Run Code Online (Sandbox Code Playgroud)
现在,如果复制,或您的应用程序,或您正在关注什么,它会注意到:
Sol*_*zky 19
将列标记为ROWGUIDCOL
允许$ROWGUID
在查询中引用它。这允许使查询更通用,因为您不需要在每个表中查找“唯一”列是什么(这对于 @Aaron 和 @Martin 分别指出的诸如 Replication 和 FileStream 之类的功能非常有用)。您可以在应用层构建查询,甚至在动态 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;
Run Code Online (Sandbox Code Playgroud)
返回类似于:
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;
Run Code Online (Sandbox Code Playgroud)
同样,可以$IDENTITY
用于具有一IDENTITY
列的表。
归档时间: |
|
查看次数: |
16415 次 |
最近记录: |