2013-01-24 2 views
11

두 개의 not nullCreatedUpdated이 포함 된 테이블이 있습니다. null이 아닌 열에 삽입 후 트리거

내가 트리거를

ALTER TRIGGER [dbo].[tr_category_inserted] ON [dbo].[Category] 
AFTER INSERT 
AS 
BEGIN 
    UPDATE Category 
    SET Created = GETDATE(), Updated = GETDATE() 
    FROM inserted 
    WHERE Category.ID = inserted.ID; 
END 

ALTER TRIGGER [dbo].[tr_category_updated] ON [dbo].[Category] 
AFTER UPDATE 
AS 
BEGIN 
    UPDATE Category 
    SET Updated = GETDATE() 
    FROM inserted 
     inner join [dbo].[Category] c on c.ID = inserted.ID 
END 

해당 쓴하지만 새 행을 삽입하고 있다면 오류를 얻을

열에 NULL 값을 삽입 할 수 없습니다 '만든 ', 표 '분류 '; 열이 널을 허용하지 않습니다. INSERT가 실패합니다.

삽입 명령을

INSERT INTO [Category]([Name], [ShowInMenu], [Deleted]) 
    VALUES ('category1', 0, 0) 

어떻게 이러한 열을 설정하지 않고 같은 트리거를 쓸 수는 널 (null) 허용?

+8

'insert'에서'date'를 자동으로 업데이트하려면'triggers' 대신'default' 제약 조건을 사용하는 것이 좋습니다 – DON

+3

트리거는 삽입 후에 만 ​​작동하고 열 값을 삽입하지 않을 수도 있으므로 오류가 발생합니다 삽입시 '생성됨'및 '업데이트 됨'. – TechDo

+1

트리거의 이름이 이미 밝혀지기 때문에 트리거가 시작된 후 ** 삽입이 발생했습니다. 그러나 'NOT NULL'열에 대해 INSERT에 ** 값 **을 제공해야합니다. 그래서 당신은 INSERT 트리거를 써서 그 컬럼의 초기 값을 설정해야한다. 간단히 말해 컬럼에 DEFAULT (GETDATE()) 제약 조건을 정의하면 자동으로 INSERT '.... –

답변

3

같은 테이블을 수정하기위한 링크를 확인하시기 바랍니다 한 테이블에 기본값 CURRENT_TIMESTAMP이있는 타임 스탬프 열. 이 문제를 극복하려면 created 열에 NULL 값을 삽입하면 현재 시간 스탬프에 두 개의 열이 모두 표시됩니다.

INSERT INTO yourTable (col1, created) VALUES ('whatever', NULL); 

또는 당신은

ALTER TABLE yourTable MODIFY COLUMN created timestamp DEFAULT '1970-01-01 00:00:00'; 

같은 유효한 타임 스탬프에 기본값을 설정하고 다음과 같이 트리거를 수정 :

ALTER TRIGGER [dbo].[tr_category_inserted] ON [dbo].[Category] 
AFTER INSERT 
AS 
BEGIN 
    UPDATE Category 
    SET Created = GETDATE() 
/* FROM inserted */ /*don't know where you got that from, do you port from SQL Server?*/ 
    WHERE Category.ID = NEW.ID; 
END 
2

트리거는 삽입 후에 만 ​​작동하고 삽입시 열 값 CreatedUpdated을 삽입하지 않을 수 있으므로 오류가 발생합니다.

오류를 없애기 위해 CreatedUpdated 열을 삽입/채울 수 있습니다. OR 열의 기본값 속성을 추가 할 수 있습니다.

ALTER TABLE yourTable MODIFY COLUMN updated timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; 
ALTER TABLE yourTable MODIFY COLUMN created timestamp DEFAULT 0; 

불행하게도 MySQL이 두 가지를 허용하지 않는 0으로 열 생성의 기본 설정 : 자세한 내용

Add column, with default value, to existing table in SQL Server

Specify Default Values for Columns

1

가능한 사용 INSTEAD OF 트리거

CREATE TRIGGER [dbo].[tr_category_inserted] ON [dbo].[Category] 
INSTEAD OF INSERT 
AS 
BEGIN 
    INSERT Category(Name, ShowInMenu, Deleted, Created, Updated) 
    SELECT Name, ShowInMenu, Deleted, GETDATE(), GETDATE() 
    FROM inserted i 
END 
0

I 일반적으로 모두 왜냐하면 내가 결코 변경되지 않았는지 알고 싶기 때문이다. 두 필드를 모두 null 값으로 유지해야하는 경우 다음과 같은 열에 기본값을 추가합니다.

ALTER TABLE [dbo].[Category] ADD DEFAULT (getdate()) FOR [Created] 
GO 

ALTER TABLE [dbo].[Category] ADD DEFAULT (getdate()) FOR [LastUpdated] 
GO 

그런 다음 삽입을 위해 트리거가 필요하지 않습니다.

어쨌든 트리거를 사용하려면 AFTER 대신 INSTEAD OF을 지정하고 insert 문을 포함해야합니다.

관련 문제