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