Вопрос:

Вместо триггера обновления в битовом столбце

sql-server tsql triggers

72 просмотра

2 ответа

146 Репутация автора

У меня есть небольшая таблица (код ниже) с PageKey (int), SendNotification (bit) с 5 возможными PageKeys на данный момент.

Требуется, чтобы не было более 1 флага ( SendNotification) активным одновременно, поэтому я хочу создать триггер, который не позволил бы изменить флаг на True, когда уже есть другой pageKey с активным флагом.

Я написал следующий триггер, но он не работает. Кроме того, если у вас есть какие-либо другие (лучшие) решения для достижения этой цели в 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]
Автор: KathyBlue Источник Размещён: 06.04.2017 02:42

Ответы (2)


1 плюс

28911 Репутация автора

Я бы вообще не использовал триггер для этого. Вместо этого я бы использовал CHECK CONSTRAINT, который проверяет UDF, который возвращает true, если нет других активных флагов, и false, если они есть.

Автор: Tab Alleman Размещён: 06.04.2017 02:50

2 плюса

23898 Репутация автора

Решение

Вы можете достичь своей цели без триггера - но только с помощью отфильтрованного уникального индекса.

Что-то вроде:

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флаг для некоторой записи, вам придется сначала очистить его для записи, в которой в данный момент установлен этот флаг.

Автор: Andy Korneyev Размещён: 06.04.2017 02:51
Вопросы из категории :
32x32