Триггер, если значение из одной таблицы меняется с нуля на другое значение - PullRequest
0 голосов
/ 01 июля 2019

У меня есть 2 таблицы House и AlarmInstall ... Мне нужно создать триггер, который обновит логический атрибут «isInstaled» на false в моей таблице House, когда я вставлю uninstallDate (отличный от Null) в мою таблицу установки сигнализации.Я немного нуб, когда дело доходит до запуска в SQL-сервере.Любая помощь будет оценена !!!

Это 2 таблицы

            [dbo].[AlarmInstall](
                [AlarmInstallId] [int] IDENTITY(1,1) NOT NULL,
                [HouseId] [int] NOT NULL,
                [InstallDate] [date] NOT NULL,
                [uninstallDate] [date] NOT NULL,
                [Model] [nchar](10) NOT NULL,


            [dbo].[House](
                [HouseId] [int] IDENTITY(1,1) NOT NULL,
                [StreetId] [int] NOT NULL,
                [DoorNr] [nchar](10) NOT NULL,
                [CityId] [int] NOT NULL,
                [IsInstalled] [bit] NULL,

Обе таблицы связаны через HouseId, то есть PK в таблице таблиц дома и FK в AlarmInstall

пробовал с этим триггером, но все мои Дома помечены как истинные !!!GO

            CREATE TRIGGER STATECHANGE
               ON  dbo.AlarmInstall
            AFTER INSERT, UPDATE
            AS 
            BEGIN
                -- SET NOCOUNT ON added to prevent extra result sets from
                -- interfering with SELECT statements.
                SET NOCOUNT ON;

            update dbo.House SET IsInstalled=1
            From  dbo.AlarmInstall a
            inner join inserted i on a.HouseId=i.HouseId
            and i.InstallDate is not null
            END

1 Ответ

0 голосов
/ 01 июля 2019

Я думаю, что это может помочь: https://www.mssqltips.com/sqlservertip/4024/sql-server-trigger-after-update-for-a-specific-value/

Вы также можете использовать вычисляемое поле для isInstalled со следующим определением:

CREATE TABLE House(
   HouseId int NOT NULL,
   [...]
   uninstallDate date NULL,
   isInstalled bit AS CASE WHEN uninstallDate IS NULL THEN 0 ELSE 1 END

Но я не вижу значениясоздавая его так (или используя триггер), потому что, если у вас нет этого поля, вы всегда можете вычислить его в запросе:

SELECT
   HouseId,
   [...]
   uninstallDate,
   CASE WHEN uninstallDate IS NULL THEN 0 ELSE 1 END AS isInstalled
FROM
   House

// Добавлен в исходный ответ

CREATE TRIGGER dbo.StateChange
   ON dbo.AlarmInstall
   AFTER INSERT, UPDATE
AS
   SET NOCOUNT ON
   BEGIN
      IF UPDATE(uninstallDate)
      BEGIN
         DECLARE @houseId int
         DECLARE @uninstallDate date
         SELECT @houseId = HouseId, @uninstallDate = uninstallDate FROM inserted

         UPDATE dbo.House
         SET IsInstalled = CASE WHEN @uninstallDate IS NULL THEN 0 ELSE 1 END
         WHERE HouseId = @houseId

      END
   END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...