-1

日付列を使用して行が最後に更新または挿入された時間を記録するための最適なトリガーは何ですか?

私はこれを試しましたが、うまくいきません:

CREATE TRIGGER trUpdate ON Tablename FOR INSERT, UPDATE 
AS

  IF @@nestlevel = 0
  BEGIN

    UPDATE Tablename 
       SET Datecolumn = GETDATE() 
      FROM 
     WHERE ID = (SELECT i.id FROM INSERTED i)

  END
4

2 に答える 2

4

あなたの構文は少しずれています:

CREATE TRIGGER dbo.trUpdate 
ON dbo.Tablename 
FOR INSERT, UPDATE 
AS
BEGIN
  SET NOCOUNT ON;

  UPDATE Tablename 
    SET Datecolumn = GETDATE() 
    WHERE ID IN (SELECT id FROM inserted);
END
GO

NOT NULLここで、列を に変更し、デフォルトをに変更する必要がありますGETDATE()。次に、更新時にこのトリガーを起動するだけです。

-- first clean up any remaining NULL values:
UPDATE dbo.Tablename 
  SET DateColumn = '19000101'
  WHERE DateColumn IS NULL;

-- now add the default constraint:
ALTER TABLE dbo.Tablename ADD CONSTRAINT
  DF_Tablename_DateColumn DEFAULT(GETDATE()) FOR DateColumn;

-- now add the NOT NULL constraint:
ALTER TABLE dbo.Tablename ALTER COLUMN DateColumn
  DATETIME NOT NULL;

-- now you can update the trigger so that it only fires on update:
ALTER TRIGGER dbo.trUpdate 
ON dbo.Tablename 
FOR UPDATE 
AS
BEGIN
  SET NOCOUNT ON;

  UPDATE Tablename 
    SET Datecolumn = GETDATE() 
    WHERE ID IN (SELECT id FROM inserted);
END
GO
于 2012-05-16T13:50:55.050 に答える
1

あなたは変わるべきです

 UPDATE Tablename 
       SET Datecolumn = GETDATE() 
  WHERE ID = (SELECT i.id FROM INSERTED i)

IF NOT UPDATE(Datecolumn)
UPDATE Tablename 
       SET Datecolumn = GETDATE() 
  WHERE ID IN (SELECT i.id FROM INSERTED i)

挿入されたテーブルは複数のエンティティを含む可能性があるためです。それ以外の場合は、正常に動作するはずです。

于 2012-05-16T13:51:17.553 に答える