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/...
Yevgraf 안드레 지바고

2
@YevgrafAndreyevichZhivago 어떻게 두 행이 같은 기본 키 값을 가질 수 있습니까? 후보자 ( 명시 적으로 정의되지 않은 ) 키 를 의미 했습니까 ?
Aaron Bertrand

13

열을 다음으로 표시 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;

다음과 유사한 것을 반환합니다.

@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.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.