2013-01-24 30 views
11

我有一張表,其中包含兩個not nullCreatedUpdated在非空列上插入後觸發

我寫了相應的觸發

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值插入列「創建',表 'Category';列不允許有空值。 INSERT失敗。

Insert命令:

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

我怎麼能寫這樣的觸發器沒有設置這些列允許空?

+8

如果您想在'insert'上自動更新'date',我建議您使用'default'約束來代替'triggers' – DON

+3

發生錯誤是因爲觸發器僅在插入後工作,您可能不會插入列值插入時創建'和'更新'。 – TechDo

+1

由於觸發器的名稱已經說過,觸發器會觸發** AFTER **插入發生 - 但是您需要爲任何NOT NULL列在INSERT上提供**值**。所以你需要編寫一個'INSTEAD OF INSERT'觸發器來設置這些列的初始值 - 或者更容易:只需在該列上定義一個'DEFAULT(GETDATE())'約束,這樣它就會自動填充到'INSERT '...... –

回答

3

修改你的表是這樣的:

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

爲已創建的列0默認不幸的是MySQL的不允許兩個時間戳列,默認爲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 
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

我通常都是由於我想知道它是否從未被更改過,所以最後更新的列是空的。如果你必須保持兩個字段爲空的我將默認值添加到這樣的那些列:

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

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

然後,你將不再需要用於插入扳機。

如果您確實想要使用觸發器,您將不得不指定INSTEAD OF而不是AFTER幷包含insert語句。