Вставить значения во вторую таблицу с помощью триггеров - PullRequest
0 голосов
/ 04 июня 2019

У меня есть одна таблица с именем [FridgeTemperture], когда любая вставленная запись должна добавить одно значение в новую таблицу MpSensors.Но записи не вставляются в новую таблицу при вставке записи.

Ошибка

Для столбца идентификаторов в таблице 'MpSensors' должно быть указано явное значение, либо для identity_insert задано значениеON или когда пользователь репликации вставляет в столбец идентификатора not for replication.

CREATE TRIGGER [dbo].[FridgeTemperature_INSERT]
   ON  [dbo].[FridgeTemperture]
   AFTER  INSERT
AS 
BEGIN
    SET IDENTITY_INSERT MpSensors ON;

    SET NOCOUNT ON;

    DECLARE @fridge_temp varchar(10)

   INSERT INTO MpSensors(fridge_temp)
       VALUES(@fridge_temp)

       SET IDENTITY_INSERT MpSensors OFF;

END

GO

схема таблицы

CREATE TABLE [dbo].[MpSensors](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [fridge_temp] [varchar](10) NULL
) ON [PRIMARY]



  CREATE TABLE [dbo].[FridgeTemperture](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [ShopId] [nvarchar](4) NULL,
        [Fridgetemp] [decimal](4, 2) NOT NULL,
        [UpdatedDate] [datetime2](7) NOT NULL

    GO

Ответы [ 3 ]

3 голосов
/ 04 июня 2019

Вам не нужно set identity_insert on, если вы не пытаетесь вставить значения в столбец идентификаторов.Кроме того, ваш текущий оператор вставки, если вы потеряете set identity_insert, будет просто внутри одной пустой строки для любого оператора вставки, успешно выполненного в таблице FridgeTemperture.
При использовании триггеров у вас есть доступ к записям, на которые влияютоператор, который запускает триггер через автоматически сгенерированные таблицы с именами inserted и deleted.
Я думаю, что вы ищете что-то вроде этого:

CREATE TRIGGER [dbo].[FridgeTemperature_INSERT]
   ON  [dbo].[FridgeTemperture]
   AFTER  INSERT
AS 
BEGIN

   INSERT INTO MpSensors(fridge_temp)
   SELECT CAST(Fridgetemp as varchar(10)) 
   FROM inserted

END

Хотя я не вижу ничегопреимущество сохранения одного и того же значения в двух разных местах и ​​в двух разных типах данных.

Обновление

После нашего разговора в комментариях вы можете просто использовать обновлениеоператор в триггере вместо оператора вставки:

UPDATE MpSensors
SET fridge_temp = (
    SELECT TOP 1 CAST(Fridgetemp as varchar(10)) 
    FROM inserted
    ORDER BY Id DESC
)

Это должно дать вам последнюю запись в случае, если у вас есть оператор вставки, который вставляет более одной записи в таблицу FridgeTemperture в одном выражении.

1 голос
/ 04 июня 2019

Вы должны использовать оператор Select с CAST, так как [fridge_temp] - это varchar в MpSensors таблице в Trigger. Попробуйте вот так:

CREATE trigger <table_name>
   ON  <table_name>
   AFTER  Insert
AS 
BEGIN    
   INSERT INTO <table_name>(column_name)
   Select CAST(column_name as varchar(10)) 
   FROM inserted    
END

Вставленная таблица хранит копии затронутых строк во время операторов INSERT и UPDATE. Во время транзакции вставки или обновления новые строки добавляются как во вставленную таблицу, так и в таблицу триггеров. Строки во вставленной таблице являются копиями новых строк в таблице триггеров.

0 голосов
/ 04 июня 2019
create TRIGGER [dbo].[FridgeTemperature_INSERT]
   ON  [dbo].[FridgeTemperture]
   AFTER  INSERT
AS 
BEGIN
  UPDATE MpSensors
   SET fridge_temp = CAST(Fridgetemp as varchar(10)) 
   FROM inserted
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...