2017-03-02 128 views
0

表的觸發器我有如下表:如何創建SQL Server 2008中

CREATE TABLE [RTS].[MFB] 
(
    [record_id] [int] IDENTITY(1,1) NOT NULL, 
    [marker_id] [nvarchar](50) NULL, 
    [lat] [numeric](38, 8) NULL, 
    [lng] [numeric](38, 8) NULL, 
    [address] [nvarchar](512) NULL, 
    [hash] [smallint] NULL, 
    [updated] [datetime] NULL, 
    [first_created_date] [datetime] NULL, 

    CONSTRAINT [PK_MFB_1] 
     PRIMARY KEY CLUSTERED ([record_id] ASC) 
        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
        IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

其中「RECORD_ID」是主鍵。

我需要在INSERT操作後創建一個觸發器。

的條件是:

  1. 如果marker_id列是新的,INSERT記錄到表和hash列設置爲0;
  2. 如果marker_id已經存在,UPDATE現有記錄通過設置新的updated列;
  3. 如果marker_id已經存在,並且「lat」,「lng」和「address」中的任何一個已經改變,則通過設置新的「lat」,「lng」和/或「address」也將「散列」設置爲「1」。

基本上,MFB表不應該有重複marker_id

如何通過設置觸發器來實現此目的?謝謝!

+0

您不能處理是否插入或通過觸發器更新,因爲它會在插入,更新和刪除後觸發。你可以根據這個表上的事件來做另一個表(很好的例子是'LOG'表)。 – Susang

+1

我建議你不要使用觸發器。我建議你在'marker_id'列上創建一個唯一索引,並確保對此表的更改只能通過執行這些業務規則的存儲過程進行。無論如何,你需要展示你已經嘗試過的東西 - 沒有人會爲你寫代碼。 –

回答

1

拉法爾是正確的,但你可以批量插入和更新的光標,但我不能保證性能就應該是這樣的

CREATE TRIGGER DBO.MFBTRG 
    ON DBO.MFB 
    INSTEAD OF INSERT,UPDATE 
AS 
BEGIN 
DECLARE @marker_id NVARCHAR(50) 
DECLARE @lat NUMERIC(38,8) 
DECLARE @lng NUMERIC(38,8) 
DECLARE @address NVARCHAR(512) 
DECLARE @hash SMALLINT 
DECLARE @updated DATETIME 
DECLARE @first_created_date DATETIME 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

DECLARE MFBINS CURSOR FAST_FORWARD FOR Select [marker_id],[lat],[lng],[address],[hash],[updated],[first_created_date] FROM INSERTED 
OPEN MFBINS 
FETCH NEXT FROM MFBINS INTO @marker_id,@lat,@lng,@address,@hash,@updated,@first_created_date 
     WHILE (@@FETCH_STATUS=0) 
     BEGIN 

IF NOT EXISTS (SELECT [marker_id] FROM MFB WHERE [marker_id]= @marker_id) 
BEGIN 
INSERT INTO [dbo].[MFB] ([marker_id],[lat],[lng],[address],[hash],[updated],[first_created_date]) 
      VALUES (@marker_id,@lat,@lng,@address,@hash,@updated,@first_created_date) 
END 
ELSE 
BEGIN 
UPDATE MFB SET [updated][email protected] WHERE [marker_id][email protected]_id 
END 


    -- Insert statements for trigger here 
FETCH NEXT FROM MFBINS INTO @marker_id,@lat,@lng,@address,@hash,@updated,@first_created_date 
END 
CLOSE MFBINS 
DEALLOCATE MFBINS 
END 
GO 

,你可以用它來檢測哪個列上更新觸發更新

IF UPDATE(COLUMN_NAME) 
BEGIN 
UPDATE LOGİC 
END 
1

如果你真的想這樣做,你將不得不創建INSTEAD OF INSERT觸發器 - 但要注意它會很慢,因爲你無法從批量插入中受益。

或者,您可以使用MERGE語句並在那裏執行您的INSERT/UPDATE場景。

相關問題