2010-01-29 2 views
6

타임 스탬프 열이있는 SQL Server 테이블이 있습니다. 레코드의 실제 업데이트없이 타임 스탬프 열을 변경하는 방법이 있습니까?레코드 데이터를 변경하지 않고 SQL Server 타임 스탬프 열을 업데이트하는 방법

내가 묻는 이유는 레코드가 자식 테이블에 삽입/업데이트/삭제 될 때 레코드의 타임 스탬프를 변경하기를 원하기 때문입니다.

타임 스탬프가이 작업을 수행하는 가장 좋은 방법은 아닙니다. 그렇지 않다면 어떻게해야합니까? 내가 datetime을 사용하고 싶지 않은 이유는 그것이 버전 관리의 좋은 방법이라고 생각하지 않기 때문입니다. 값을 증가시키기 위해 값을 읽지 않아도되기 때문에 정수를 사용하고 싶지 않습니다.

제안 사항?

+0

날짜 시간을 사용하는 다른이 뭔가를 columns..is 또는 당신이 날짜 시간을 사용하지 않으려는 이유를 명확히 할 수 있습니까? – dan

+1

DateTime 데이터 유형을 버전 관리 및 낙관적 동시성에 사용해서는 안되는 이유에 대한 기사를 읽었습니다. 모든 세부 사항을 기억할 수는 없지만 그 당시에는 의미가있었습니다. 데이터 유형의 정확성 때문이라고 생각합니다. 이론적으로 동일한 상황에서 업데이트가 발생하여 경쟁 조건이 발생할 수 있습니다. –

+0

데이터베이스에서 날짜/시간을 제공하지 않는 경우 - SQL Server DATETIME은 초 단위로 나타납니다. http://msdn.microsoft.com/en-us/library/ms187819.aspx –

답변

9

정수를 사용하고 싶지 않습니다. 값을 늘리려면 값을 읽지 않으려 고합니다. 즉 기술적으로 읽기를 요구 않지만

UPDATE Table SET 
    IntColumn = IntColumn + 1 

, 나는 그것으로 문제가 표시되지 않습니다.

당신은 언제나 같은 값으로 업데이트 할 수 있습니다 :뿐만 아니라 rowversion 업데이트를 트리거

UPDATE Table SET 
    SomeColumn = SomeColumn 

.

ADDITION : 당신은 최대 아이들의 rowversion으로보기를 할 수있는 :

SELECT Parent.*, MaxChildRowVersion as ChildVersion 
FROM Parent 
JOIN (
    SELECT ParentId, MAX(RowVersion) as MaxChildRowVersion 
    FROM Child 
    GROUP BY ParentId 
) as Child ON 
    Parent.ParentId = Child.ParentId 

그러나, 당신은 당신의 자신의 갱신 구현할 수 있지만 아니, 당신이 직접 (A rowversion 열을 업데이트 할 수 없습니다 @@ DBTS, 바이너리 (8) 및 INSTEAD OF 트리거 ...)

마지막 요점의 예를 들려 줄 수 있습니까? 그것은 유망한 것으로 들립니다.

아니요, 실제로 그렇지 않습니다. ;) 그냥 대신 동일한 값으로 업데이트하거나보기를 사용할 수있을 때 너무 많은 작업이 필요합니다. 그것들은 가장 쉬운 2 가지 옵션입니다.

그러나 완료하려면 기본값 @@ DBTS (데이터베이스 버전 번호를 반환)가있는 이진 (8) 열과 이진 열을 새로운 @@ DBTS로 업데이트하는 AFTER UPDATE 트리거 수동으로 업데이트 할 수있는 psuedo-rowversion 유형을 제공합니다. 그것은 다른 컬럼을 업데이트하는 것보다 더 빠르거나 낫지 않을 것입니다.

+0

마지막 포인트의 예를 줄 수 있습니까? 그것은 유망한 것으로 들립니다. –

1

triggers을 사용해 보셨나요? 그것은 당신이 겪고있는 것에 더 자연스럽게 들어 맞는 것 같습니다.

한 번에 한 번 타임 스탬프가있는 응용 프로그램에서 작업했습니다. 우리가 그 (것)들로하기 위하여 가정 된 무엇을 정확하게 우리가 그 (것)들을 스키머에서 감사 했는 까라고 곤혹스럽게 증명했다. 데이터를 기반으로 생성 한 객체에 타임 스탬프를 읽을 수 있습니다. 데이터가 더럽지 만 업데이트 및 롤백 할 때 변경되었는지 확인합니다.하지만 많은 이득이 아닌 상용구가 많이 있습니다 (at 적어도 내가 일하고있는 도메인에서).

+0

나는 실제로있다. 그러나 업데이트 할 타임 스탬프 열을 얻으려면 계속 트리거해야합니다. 그것은 내 질문이었다. –

0

더 좋은 아이디어가 올 때까지 DateChildrenChanged라는 부모 테이블에 DateTime 열을 추가하는 것입니다.

DateChildrenChanged 열을 현재 DateTime으로 설정하는 트리거를 하위 테이블에 추가하고 그럴 경우 상위 테이블의 타임 스탬프 열도 업데이트됩니다.

이렇게하면 버전 관리에 타임 스탬프 열이 사용됩니다.

나는 여전히 아이디어에 열중하고 있습니다.

+0

그게 최선의 방법이라고 생각합니다. 실제 행의 버전을 지정하려면 TIMESTAMP/ROWVERSION을 유지하십시오. 당신의 자식 행을 버전화할 필요가 있다면 TIMESTAMP/ROWVERSION 컬럼도 같이 두십시오. –

4

로니, 모든 timestamp 구문의

먼저 Microsoft에서 사용되지 않는, 그래서 당신은 두 번째 rowversion은 항상 행에 관련되어, rowversion를 사용할 필요가되고있다. 각 데이터베이스는 내 rowversion 열을 포함하는 테이블에서 수행되는 각각의 삽입 또는 업데이트 동작에 대해 증가하는 카운터를 갖는

rowversion

: 문서에서

데이터 베이스. 이 카운터는 데이터베이스 rowversion입니다.

그러나 SQL 서버에서 구현 된 방식이기 때문에 원하는 것을 얻기 위해 트리거를 사용해야합니다. 이 같은

뭔가 : 보통 LASTMODIFIED에 대한

CREATE TRIGGER tgUpdateParentRowVersion ON ChildTable FOR INSERT, DELETE, UPDATE 
AS 
BEGIN 
    /* 
    * The updates below force the update of the parent table rowversion 
    */ 
    UPDATE ParentTable 
     SET ChildUpdate = ChildUpdate + 1 
    FROM ParentTable a 
    JOIN inserted i on a.pkParentTable = i.fkParentTable 

    UPDATE ParentTable 
     SET ChildUpdate = ChildUpdate - 1 
    FROM ParentTable a 
    JOIN deleted  d on a.pkParentTable = d.fkParentTable 
END 
+0

deprecation에 관해서는, 저는 다른 방향이었습니다 : rowversion은 더 이상 사용되지 않을 것입니다. 나는 틀릴 수 있습니다 ... –

+0

@ 로니 : 당신은 ** 틀렸고 파울루가 옳습니다. TIMESTAMP는 그 이름이 많은 혼란을 야기했기 때문에 더 이상 사용되지 않습니다. 사람들은 그 이름을 날짜와 시간으로 변환하는 방법이 있다고 생각했습니다. ROWVERSION은 새로운 길을 가고 있습니다 –

+0

나는 서서. 감사. –

관련 문제