2013-01-24 15 views
11

の列CreatedUpdatedの2つのテーブルがあります。ヌルの列に挿入した後のトリガー

私が作成した「私はエラー

を取得し、トリガー

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値を挿入することはできません書きました'、テーブル 'カテゴリ ';列はNULLを許可しません。 INSERTは失敗します。

Insertコマンド:私はnullを許可するように、これらの列に設定することなく、このようなトリガを書くことができますどのように

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

+8

'insert'で' date'を自動的に更新したい場合は、 'triggers'の代わりに' default' constraintを使うことをお勧めします。 – DON

+3

トリガーは挿入後にしか動作しないので、挿入時に「作成」および「更新」されます。 – TechDo

+1

トリガーの名前が既に述べているので、トリガは起動します**挿入後に**が発生しますが、 'NOT NULL'カラムに対してINSERTに**値**を与える必要があります。したがって、これらの列の初期値を設定するために 'INSTEAD OF INSERT'トリガを書く必要があります。あるいは、その列に' DEFAULT(GETDATE()) '制約を定義するだけで自動的に' INSERT '.... –

答えて

3

このようなあなたのテーブルを修正するためにリンクをチェックしてください1つのテーブルにデフォルト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 columnのデフォルト値プロパティを追加できます。

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

は、残念ながら、MySQLは2を許可していません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になります。私はこのようなそれらの列にデフォルト値を追加し、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ステートメントを含める必要があります。

関連する問題