2010-06-07 58 views
0

我只是想要一個像這樣的postgresql版本的更新觸發器...在我看來,沒有新的。和老年人。在MSSQL?如何在Transact SQL(SQL Server 2008)中實現這個

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

已經Google搜索,但沒有找到不幸的是......想法?

更新: ......這樣?

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(); 

bothg當然不工作;)

+4

爲什麼你是否使用觸發器來設置默認約束? – 2010-06-07 22:03:52

+0

嗯,不好的例子..但我會需要它的「mtime」然後... – David 2010-06-07 22:33:47

+0

INSERTED是一張桌子。 – 2010-06-07 22:38:37

回答

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表可能包含多行。

+0

對不起,我沒有得到它..看到我更新的帖子.. – David 2010-06-07 22:34:09

+1

@大衛更新包括一些例子。 – 2010-06-07 23:13:40

1

首先,對於插入,您可以將默認值設置爲GETDATE()。

然後在更新,嘗試這樣的事情:

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

對於觸發器,SQL使「插入」命名的可用虛擬表和「刪除」。下面是一個示例程序觸發我已經到位了幾個月(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 

(請注意,這是一個觸發「後」,所以我只需要運行一個UPDATE)