13

not nullと の 2 つの列Createdを含むテーブルがありUpdatedます。

対応するトリガーを書きました

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 を列 'Created'、テーブル 'Category' に挿入できません。列はヌルを許可しません。INSERT は失敗します。

コマンドを挿入:

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

null を許可するようにこれらの列を設定せずに、このようなトリガーを作成するにはどうすればよいですか?

4

4 に答える 4

3

次のようにテーブルを変更します。

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

CURRENT_TIMESTAMPcreate to 列のデフォルトを 0 に設定します。 残念ながら、MySQL では、デフォルトで 1 つのテーブルに2 つのタイムスタンプ列を使用できません。これを克服するには、列にNULL値を挿入するだけcreatedで、両方の列が現在のタイムスタンプになります。

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
于 2013-01-24T09:27:14.660 に答える
2

可能な使用INSTEADOFトリガー

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
于 2013-01-24T09:54:46.160 に答える
2

Createdトリガーが挿入後にのみ機能し、挿入時に列の値を挿入していない可能性があるため、エラーが発生しますUpdated

したがって、エラーを解消するために、列Createdを挿入/挿入し、挿入することができますUpdated。または列のデフォルト値プロパティを追加できます。詳細はリンク先をご確認ください

SQL Server の既存のテーブルに、既定値で列を追加します。

列のデフォルト値を指定する

于 2013-01-24T09:16:51.607 に答える
0

私は通常、最後に更新された列が変更されていないかどうかを知りたいので、最後に更新された列を null にすることを許可します。両方のフィールドを null 可能にしておく必要がある場合は、次のようにそれらの列にデフォルト値を追加します。

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

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

その後、挿入のトリガーは必要ありません。

とにかくトリガーを本当に使用したい場合は、挿入ステートメントを含めるのINSTEAD OFではなく、指定する必要があります。AFTER

于 2013-12-18T16:44:19.677 に答える