2017-04-06 11 views
0

PageKey(int)、SendNotification(bit)の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つしかないと仮定します。 1回の操作で1回発射されます。また、トリガー内でロールバックを発行するように注意する必要があります。これは、トランザクションを持つアプリケーションで大混乱を招く可能性があります。 –

答えて

2

トリガーなしで目標を達成できますが、フィルタリングされたユニークインデックスを使用するだけです。

何かのように:これは、あなたには、いくつかのレコードのSend_Notificationフラグを設定する必要がある場合ので、あなたのテーブルには、Send_Notification = 1を持つ複数のレコードを持つことができません

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

- あなたが最初にそれをクリアする必要があります現在このフラグが設定されているレコード

+0

フィルタされたインデックスのSQL Serverのどのバージョンが利用可能になりますか? –

+1

@ TabAlleman私が覚えている限り、少なくとも2008年版で利用可能です –

+0

@AndyKorneyevありがとう、このソリューションはもっとエレガントで、目的を完璧に機能します。ホイールを再発明する必要はありません;-) – KathyBlue

1

。代わりに、他のアクティブなフラグがない場合はtrueを返すUDFをチェックするCHECK CONSTRAINTを使用し、存在する場合はfalseを使用します。

関連する問題