如何在Transact SQL中实现这一点(SQL Server 2008)

时间:2010-06-07 22:02:15

标签: sql sql-server postgresql triggers

我只想要像这个postgresql版本的更新触发器...在我看来没有新的。和老人。在MSSQL中?

CREATE OR REPLACE FUNCTION "public"."ts_create" () RETURNS trigger AS
DECLARE
BEGIN
  NEW.ctime := now();
  RETURN NEW;
END;

已经谷歌了,但遗憾的是没有发现......想法?

更新: 是的,像这样?

CREATE TRIGGER tr01 ON Auctions for insert
As
update auctions set mtime = GETDATE() where Id = inserted.Id;

或者这个:

CREATE TRIGGER tr01 ON Auctions for insert
As
inserted.ctime := GETDATE();

当然没有工作;)

3 个答案:

答案 0 :(得分:4)

In SQL Server伪表称为INSERTED and UPDATED

我会在特定示例的ctime列上使用默认约束,但是:

CREATE TRIGGER schema.tbl_name_insert ON schema.tbl_name
    AFTER INSERT
    AS
        SET NOCOUNT ON

        UPDATE schema.tbl_name
        SET mtime = getdate()
        FROM schema.tbl_name
        INNER JOIN JOIN INSERTED
            ON schema.tbl_name.PK = INSERTED.PK

CREATE TRIGGER schema.tbl_name_insert ON schema.tbl_name
    AFTER INSERT
    AS
        SET NOCOUNT ON

        UPDATE schema.tbl_name
        SET mtime = getdate()
        FROM schema.tbl_name
        WHERE schema.tbl_name.PK IN (SELECT PK FROM INSERTED)

触发器会为整个INSERT语句触发一次,因此,通常,INSERT AND DELETED表可能包含多行。

答案 1 :(得分:3)

对于触发器,SQL提供名为“inserted”和“deleted”的虚拟表。这是我已经实施了几个月的示例例程触发器(SQL 2005):

CREATE TRIGGER [MAP].[TR_iu_MyTable__LastUpdated]
 on [dbo].[MyTable]
 after insert, update

AS

    SET NOCOUNT on

    UPDATE MAP.MyTable
     set LastUpdated = getdate()
     where MyTableId in (select MyTableId from inserted)

GO

(请注意,这是一个“after”触发器,因此我只需要运行UPDATE。)

答案 2 :(得分:1)

首先,对于插入,您可以将默认值设置为GETDATE()。

然后在更新时,尝试这样的事情:

CREATE TRIGGER TimeUpdater ON Auctions FOR UPDATE
AS
UPDATE auctions 
SET mtime = GETDATE() 
FROM UPDATED u
WHERE Id = u.Id