2013-05-22 6 views
0

다음 요구 사항이 있습니다.timestamp, rowversion 및 datetime - 행을 삽입하거나 업데이트 할 때 표시가 필요합니다.

고유 한 자동 증분 Int ID 및 데이터 열이있는 테이블이 있습니다. 다음이 필요합니다. 행이 해당 테이블에 삽입 될 때마다 테이블의 오른쪽 끝에있는 열은 해당 삽입의 전체 datetime을 보유해야합니다. 또한 행이 업데이트 된 경우 해당 행의 업데이트 시간을 보유하도록 업데이트되도록 해당 행을 테이블에 삽입하는 전체 datetime을 보유하는 열이 필요합니다. 이제

이 작업을 수행 할 수있는 분명하고 매우 간단한 방법은 다음과 같습니다 당신은 당신의 테이블을 만들 :

ALTER TABLE My_Test_Table 
ADD [timestamp] datetime; 
ALTER TABLE My_Test_Table 
ADD CONSTRAINT DF_My_Test_Table_timestamp DEFAULT GETDATE() FOR [timestamp]; 
:

create table My_Test_Table 
(my_id int identity not null, 
my_data nvarchar(max)); 

당신이 당신의 테이블 그것에 날짜 컬럼과 기본 제약 조건을 추가하는 변경을

다음과 같이 업데이트 할 수있는 좋은 트리거를 만듭니다.

CREATE TRIGGER DML_Trigger_update_My_Test_Table 
ON My_Test_Table 
FOR UPDATE 
AS 
IF @@ROWCOUNT <> 0 
BEGIN 
IF EXISTS (SELECT * FROM INSERTED) AND EXISTS (SELECT * FROM DELETED) 
BEGIN 
UPDATE My_Test_Table 
SET [timestamp] = GETDATE() 
FROM INSERTED 
WHERE My_Test_Table.my_id = INSERTED.my_id; 
END 
END 

이제 까다로운 부분은 다음과 같습니다. 위의 범위를 벗어나는 이유 때문에 위와 똑같이 구현하지만 트리거가 필요하지 않습니다. 가능합니까? SQL 형식 타임 스탬프 또는 rowversion을 사용하고 싶지 않습니다.이 작업은 저에게 효과적이지 않습니다. 날짜가 필요합니다. 밀리 초 단위로 해당 열에 명확하게 저장해야합니다. 어떤 아이디어라도 높이 평가할 수 있습니다.

답변

4

당신은 당신이 사용하는 UPDATE 문에서 소스 값으로 DEFAULT 키워드를 사용할 수있는 트리거

필요하지 않습니다, 음, DEFAULT 제약 조건이 해당 컬럼에 정의

UPDATE 
    MyTable 
SET 
    foo = ..., 
    bar = ..., 
    ChangedDateTime = DEFAULT 
WHERE 
    ...; 

나는 같으면 timestamp because this has meaning on SQL Server, as a synonym for rowversion이라는 열을 사용하지 마십시오. SQL Server 2008 +의 경우 밀리 초를 정확하게 기록하려면 datetime2(3)을 사용하십시오. "이전"datetime은 반올림 한 3.33 밀리 초로 정확합니다