2017-03-02 90 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场景。

相关问题