如何创建SQL Server 2008中
问题描述:
表的触发器我有如下表:如何创建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
操作后创建一个触发器。
的条件是:
- 如果
marker_id
列是新的,INSERT
记录到表和hash
列设置为0; - 如果
marker_id
已经存在,UPDATE
现有记录通过设置新的updated
列; - 如果
marker_id
已经存在,并且“lat”,“lng”和“address”中的任何一个已经改变,则通过设置新的“lat”,“lng”和/或“address”也将“散列”设置为“1”。
基本上,MFB表不应该有重复marker_id
。
如何通过设置触发器来实现此目的?谢谢!
答
拉法尔是正确的,但你可以批量插入和更新的光标,但我不能保证性能就应该是这样的
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
答
如果你真的想这样做,你将不得不创建INSTEAD OF INSERT触发器 - 但要注意它会很慢,因为你无法从批量插入中受益。
或者,您可以使用MERGE语句并在那里执行您的INSERT/UPDATE场景。
您不能处理是否插入或通过触发器更新,因为它会在插入,更新和删除后触发。你可以根据这个表上的事件来做另一个表(很好的例子是'LOG'表)。 – Susang
我建议你不要使用触发器。我建议你在'marker_id'列上创建一个唯一索引,并确保对此表的更改只能通过执行这些业务规则的存储过程进行。无论如何,你需要展示你已经尝试过的东西 - 没有人会为你写代码。 –