문제

테이블이 정의되어 있습니다(아래 코드 조각 참조).행이 변경될 때마다 LastUpdate 열이 자동으로 업데이트되도록 제약 조건 등을 추가하려면 어떻게 해야 합니까?

CREATE TABLE dbo.Profiles
(
        UserName                                varchar(100)            NOT NULL,
        LastUpdate                              datetime                NOT NULL  CONSTRAINT DF_Profiles_LastUpdate DEFAULT (getdate()),
        FullName                                varchar(50)             NOT NULL,
        Birthdate                               smalldatetime           NULL,
        PageSize                                int                     NOT NULL CONSTRAINT DF_Profiles_PageSize DEFAULT ((10)),
        CONSTRAINT PK_Profiles PRIMARY KEY CLUSTERED (UserName ASC),
        CONSTRAINT FK_Profils_Users FOREIGN KEY (UserName) REFERENCES dbo.Users (UserName) ON UPDATE CASCADE ON DELETE CASCADE  
)
도움이 되었습니까?

해결책

기본 제약조건은 삽입에만 적용됩니다.업데이트하려면 트리거를 사용하세요.

다른 팁

나는 다른 의견에 동의합니다. LastUpdate 열에 GetDate()의 기본값을 설정한 다음 트리거를 사용하여 모든 업데이트를 처리합니다.

다음과 같이 간단합니다.

CREATE TRIGGER KeepUpdated on Profiles
FOR UPDATE, INSERT AS 
UPDATE dbo.Profiles 
SET LastUpdate = GetDate()
WHERE Username IN (SELECT Username FROM inserted)

정말 멋진 내용을 원한다면 데이터베이스에 있는 내용과 변경된 내용을 평가하고 차이가 있는 경우에만 LastUpdate를 수정하십시오.

이걸 고려하세요...

  • 오전 7시 - 사용자 'jsmith'가 'Smithe'라는 성을 사용하여 생성되었습니다(죄송합니다). LastUpdate의 기본값은 오전 7시입니다.

  • 오전 8시 - 'jsmith'는 IT 부서에 이메일을 보내 자신의 이름이 틀렸다고 알립니다.즉시 업데이트를 수행하므로 성은 이제 'Smith'이고 (트리거 덕분에) LastUpdate는 오전 8시를 표시합니다.

  • 오후 2시 - 게으른 동료가 마침내 StumbleUpon에 싫증이 나서 이메일을 확인합니다.그는 이름 변경에 관한 'jsmith'의 이전 메시지를 봅니다.그가 달린다: 업데이트 프로필 SET LastName='Smith' WHERE 사용자 이름='jsmith' 그리고 서핑 마이 스페이스로 돌아갑니다.그러나 트리거는 성이 이미 'Smith'라는 사실을 신경 쓰지 않으므로 LastUpdate는 이제 오후 2시를 표시합니다.

업데이트 문이 실행될 때마다 LastUpdate를 맹목적으로 변경하는 경우 업데이트가 발생했기 때문에 기술적으로는 정확하지만 실제로 변경 사항을 비교하고 그에 따라 조치하는 것이 더 합리적일 수 있습니다.이렇게 하면 동료의 오후 2시 업데이트 문은 계속 실행되지만 LastUpdate는 여전히 오전 8시로 표시됩니다.

--케빈

하위 쿼리 대신 삽입에 조인을 사용하더라도 트리거 아이디어에 동의합니다.그러나 사용자 이름은 기본 키에 대한 선택이 특히 좋지 않다는 점을 지적하고 싶습니다.사용자 이름은 자주 변경되며, 변경되면 모든 관련 테이블을 변경해야 합니다.사용자 ID를 키로 갖고 사용자 이름에 고유 인덱스를 추가하는 것이 훨씬 좋습니다.그러면 사용자 이름이 변경될 때 다른 것을 변경할 필요가 없습니다.

이를 위해서는 트리거를 사용해야 합니다.

내 제안은 lastUpdate를 getdate()로 기본 설정하는 저장 프로시저를 만드는 것입니다.

나는 과거에 트리거를 피하려고 노력했습니다. 왜냐하면 SQL2005 이전에는 트리거를 찾아 편집하는 것이 골치 아픈 일이었기 때문입니다.특히 프로젝트를 처음 접하는 개발자의 경우 더욱 그렇습니다.

또한 이를 열 정의의 기본값으로 추가하세요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top