programing

SQL Server 테이블에 "마지막으로 수정" 및 "생성" 열을 추가하려면 어떻게 해야 합니까?

padding 2023. 9. 10. 12:01
반응형

SQL Server 테이블에 "마지막으로 수정" 및 "생성" 열을 추가하려면 어떻게 해야 합니까?

SQL Server 2012 데이터베이스를 위한 새로운 db 스키마를 설계하고 있습니다.

에는 에는 의 이 이 에는 의 2modified그리고.created행을 삽입하거나 업데이트하는 즉시 자동으로 변경해야 합니다.

어떻게 가는 것이 가장 좋은 방법인지 모르겠습니다.

방아쇠가 가장 좋은 방법이라고 생각합니다.

트리거에 대한 예시를 찾으려고 했습니다.하지만 제가 찾은 튜토리얼은 다른 테이블 등에 데이터를 삽입합니다.

꽤 흔한 시나리오인 줄 알았는데 아직 답을 찾지 못했습니다.

created합니다 - 은합니다 -지 aDATETIME2(3)때 조건이 된 열:을할때는본약이열는새:열는nh이s새약at을nn:wt본

Created DATETIME2(3) 
   CONSTRAINT DF_YourTable_Created DEFAULT (SYSDATETIME())

할 에 때YourTable지다 값을 Created됩니다. , 으로 됩니다 됩니다 으로 .

modified더해요좀은그면그로ersau,ao,면e'ked좀t해요l더AFTER UPDATE- 에서 이 할 수 case and update - SQL Server에서 사용하는 경우에는 사용자가 원하는 대로 수행할 수 없습니다.

Modified DATETIME2(3)

그리고 나서.

CREATE TRIGGER updateModified
ON dbo.YourTable
AFTER UPDATE 
AS
   UPDATE dbo.YourTable
   SET modified = SYSDATETIME()
   FROM Inserted i
   WHERE dbo.YourTable.PrimaryKey = i.PrimaryKey

여러분은 에 .Inserted해당 테이블에 대한 기본 키에서 기본 테이블과 함께 업데이트된 모든 행을 포함하는 의사 테이블.

그리고 당신은 이것을 창조해야 할 것입니다.AFTER UPDATE원하는 각 테이블에 대해 트리거합니다.modified종렬로 늘어놓다

일반적으로 다음과 같은 열을 가질 수 있습니다.

  • 마지막으로 수정한 사용자
  • 마지막으로 수정한 설정
  • 작성자
  • 생성된 설정

LastModifiedBy그리고.CreatedBy는 a는 a한 a다에aoee한a는에users표)UserID및 ( ) 항목LastModifiedOn그리고.CreatedOn열은 날짜 및 시간 열입니다.

다음 옵션이 있습니다.

  1. 트리거 없는 솔루션 - "트리거를 작성하는 가장 좋은 방법은 그러한 트리거를 작성하지 않는 것입니다."라는 글을 어딘가에서 읽었습니다. 일반적으로 트리거가 성능을 저하시킨다는 것을 알아야 합니다.따라서 트리거를 사용하는 경우에도 트리거를 사용하는 것이 가장 쉬워 보일 수 있습니다.

    그러니까, 당신들 모두를 편집하세요.INSERT그리고.UPDATE를는장e는을 포함하는 UserID현재 날짜 및 시간.user ID할 수 안 함) 할 수 .0의값인우신)우user ID지정되어 있습니다.NULL를 보면.NULL값이 삽입되어 있습니다. "substant" 문을 찾아서 편집해야 합니다.

  2. - 가 할 - 을 만들 수 있습니다.AFTER INSERT, UPDATE트리거하고 사용자 열을 채웠습니다. 얻을 수 의서짜및을게올다용수재(용다수올의te게ne서'(rod재ystefeGETUTCDATE()예를 들어).여기서 문제는 트리거가 매개 변수 전달/수용을 허용하지 않는다는 것입니다.그래서, 당신이 삽입하는 것이 아니기 때문에.user IDvalue에 할 수 .현재 사용자를 찾는 방법은?

    SET CONCONT_를 사용하시면 됩니다.INFOCONCONT_INFO.당신보다 먼저insert그리고.update야는들ee는야sue을 사용해야 합니다.SET CONTEXT_INFO하다를 current user ID재트및서인용인용oeeCONTEXT_INFO그것을 추출하는 기능.

할 때 를 할 는 해야 을 해야 을 을 편집해야 합니다.INSERT그리고.UPDATE절 - 그래서 절을 사용하지 않는 것을 선호합니다.

어쨌든 날짜 및 시간 열만 있어야 하고 열로 생성/수정하지 않아야 하는 경우 트리거를 사용하면 현재 및 앞으로 다른 문을 편집하지 않기 때문에 보다 내구성이 높고 쉬워집니다.


와 함께SQL Server 2016이제 SESSION_CONTEXT 기능을 사용하여 세션 세부 정보를 읽을 수 있습니다.세부 정보는 sp_set_session_context를 사용하여 설정합니다(다음과 같이)read-only아니면read and write입니다 :). 사용자 친화적입니다.

EXEC sp_set_session_context 'user_id', 4;  
SELECT SESSION_CONTEXT(N'user_id');  

좋은 예입니다.

주의하십시오. 위의 내용은 잘 작동하지만 모든 경우에 해당되지는 않습니다. 시간을 많이 낭비하여 도움이 된다는 것을 알게 되었습니다.

create TRIGGER yourtable_update_insert
ON yourtable
AFTER UPDATE 
as
begin
   set nocount on;
   update yourtable set modified=getdate(), modifiedby = suser_sname()
   from  yourtable t 
   inner join inserted i on t.uniqueid=i.uniqueid 
end
go

set nocount on;면가다지다가면:esrd지tsu .


마이크로소프트 SQL 서버 관리 스튜디오


업데이트된 행이 없습니다.

5행의 데이터가 커밋되지 않았습니다.오류 출처:마이크로소프트.SqlServer.관리.데이터 도구.오류 메시지:업데이트되거나 삭제된 행 값은 행을 고유하게 만들지 않거나 여러 행(2개 행)을 변경합니다.

오류를 수정하고 다시 시도하거나 ESC를 눌러 변경을 취소합니다.


OK 도움말


CREATE TRIGGER [dbo].[updateModified]
   ON  [dbo].[Transaction_details] 
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;
    UPDATE dbo.Transaction_details
    SET ModifedDate = GETDATE() FROM dbo.Transaction_details t JOIN inserted i ON 
    t.TransactionID = i.TransactionID--SYSDATETIME()
END

한 가지 중요한 사항은 모든 테이블과 행에 대한 삽입/업데이트 시간이 항상 동일한 시간 소스에 있어야 한다는 것입니다.트리거를 사용하지 않으면 테이블에 직접 업데이트하는 여러 응용 프로그램이 클럭 시간이 다른 시스템에 있거나 로컬과 로컬의 일관된 사용이 없을 위험이 있습니다.응용 프로그램 계층에서 UTC.

업데이트/수정된 시간 값을 직접 설정하는 삽입 또는 업데이트 쿼리를 수행하는 시스템에 5분 늦은 클럭이 있거나(가능하지 않지만 고려할 가치가 있습니다) UTC 대비 현지 시간을 사용하는 경우를 고려합니다.다른 시스템이 1분 간격으로 폴링하는 경우 업데이트를 놓칠 수 있습니다.

여러 가지 이유로, 저는 제 테이블을 애플리케이션에 직접 노출하지 않습니다.이 상황을 해결하기 위해 접근할 필드(업데이트/수정된 시간 필드 포함)를 명시적으로 나열하는 보기를 테이블에 작성합니다.그런 다음 뷰에 업데이트 대신 삽입 트리거를 사용하고 데이터베이스 서버의 클럭을 사용하여 업데이트된 시간을 명시적으로 설정합니다.이렇게 하면 데이터베이스에 있는 모든 레코드의 타임베이스가 동일하다는 것을 보장할 수 있습니다.

다음과 같은 몇 가지 이점이 있습니다.

  1. 기본 테이블에 한 번만 삽입하므로 계단식 트리거가 호출되는 것에 대해 걱정할 필요가 없습니다.
  2. 이를 통해 비즈니스 계층이나 데이터의 다른 소비자에게 노출되는 정보를 현장 수준에서 제어할 수 있습니다.
  3. 기본 테이블로부터 독립적으로 뷰를 보호할 수 있습니다.

SQL Azure에서 잘 작동합니다.

보기에서 트리거의 예를 살펴봅니다.

ALTER TRIGGER [MR3W].[tgUpdateBuilding] ON [MR3W].[vwMrWebBuilding]
INSTEAD OF UPDATE, INSERT AS
BEGIN

SET NOCOUNT ON

IF EXISTS(SELECT * FROM DELETED)
BEGIN
    UPDATE [dbo].[Building]
       SET 
          ,[BuildingName] = i.BuildingName
          ,[isActive] = i.isActive
          ,[updatedAt] = getdate()
     FROM dbo.Building b
     inner join inserted i on i.BuildingId = b.BuildingId
END
ELSE
BEGIN
INSERT INTO [dbo].[Building]
           (
            [BuildingName]
           ,[isActive]
           ,[updatedAt]
           )

           SELECT 
               [BuildingName]
              ,[isActive]
              ,getdate()
              FROM INSERTED
    END
END

저는 이것이 도움이 되기를 바라며, 이것이 최선의 해결책이 아닌 이유가 있다면 논평을 환영합니다.

이 솔루션은 모든 사용 사례에 적용되지는 않지만 가능한 한 깨끗한 방법입니다.테이블에 행을 삽입/업데이트하기 위한 저장 프로시저를 만들고 테이블을 수정할 때만 이 sp를 사용합니다.저장 프로시저에서는 항상 생성되고 업데이트된 열을 필요에 따라 설정할 수 있습니다(예: 업데이트된 설정).시간 = UTCTime() 가져오기

언급URL : https://stackoverflow.com/questions/31634918/how-do-i-add-a-last-modified-and-created-column-in-a-sql-server-table

반응형