2017-04-06 51 views
0

我有一个小的表(代码如下)与PageKey(int),SendNotification(位)与5个可能PageKeys此刻。而不是更新触发位列

要求是不要有超过1个标志(SendNotification)同时处于活动状态,所以我想创建一个触发器,当已有另一个pageKey带有活动标志时,不允许将标志更改为True。

我写了下面的触发器,但它似乎没有工作。另外,如果你有任何其他(更好的)解决方案在SQL Server 2012中实现这一点,我会很感激。

CREATE TRIGGER trg_Notification_Flag 
ON dbo.t_Notification_Flag 
INSTEAD OF UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @countOfExistingFlags INT; 
    DECLARE @PageKey INT; 

    SELECT @countOfExistingFlags = COUNT(*) 
    FROM dbo.t_Notification_Flag 
    WHERE SendNotification = 1; 

    SELECT @PageKey = inserted.PageKey 
    FROM inserted; 

    IF @countOfExistingFlags > 1 
    BEGIN 
     PRINT 'There is an existing active flag. No changes has been done.'; 
     ROLLBACK TRANSACTION; 
    END; 
    ELSE 
    BEGIN 
     UPDATE dbo.t_Notification_Flag 
     SET SendNotification = 1 
     WHERE PageKey = @PageKey; 
    END; 
END; 
GO 

表是:

CREATE TABLE [dbo].[t_Notification_Flag] 
(
    [PageKey] [int] NOT NULL, 
    [SendNotification] [bit] NOT NULL, 
    [NotificationMessage] [nvarchar](100) NOT NULL, 
    [NotificationHeader] [nvarchar](50) NULL, 
    [Country_Key] [int] NULL 
) ON [PRIMARY] 
+3

你的触发器有一个主要缺陷。它假定插入时只有1个值。每次操作触发器触发一次。此外,您应该小心在触发器内发出回滚。这可能会对具有事务的应用程序造成严重破坏。 –

回答

2

您可以在不触发的情况下实现您的目标 - 但只需过滤唯一索引。

喜欢的东西:

create table dbo.#Temp (PageKey int, Send_Notification bit) 
create unique index IX_Temp on dbo.#temp(Send_Notification) where Send_Notification = 1 

这会不会让你的表成具有Send_Notification = 1多条记录,因此,如果您需要设置Send_Notification标志某些记录 - 你必须先清除它当前有此标志设置的记录。

+0

什么版本的SQL Server筛选索引可用? –

+1

@TabAlleman据我记忆,他们至少在2008年的版本 –

+0

@AndyKorneyev非常感谢,这种解决方案是更加优雅,完美的目的。不需要重新发明轮子;-) – KathyBlue

1

都为了这个,我不会使用触发器。相反,我会使用CHECK CONSTRAINT来检查UDF,如果没有其他活动标志,则返回true;如果没有其他标志,则返回false。

相关问题