Nano Hash - криптовалюты, майнинг, программирование

Триггер SQL Server для вставки, обновления, удаления данных в другую таблицу на основе изменений в другой таблице

Я новичок в SQL Server (Express) и был бы очень признателен за помощь новичку. У меня есть разделенная база данных Access, таблицы которой я перенес в SQL Server. Последняя проблема, которую мне нужно решить, - это создать триггер, который будет обновлять строки данных в одной таблице на основе обновлений / изменений данных в другой таблице. Есть две таблицы, на которых мне нужно создать триггеры, но я предполагаю, что, как только я получу одну правильно, мне просто нужно будет использовать ту же логику для второй.

Суть в том, что данные вводятся в tblData и tblFamily, и некоторые столбцы в этих таблицах такие же, как некоторые столбцы в Contacts (например, имя, адрес, город, штат, почтовый индекс и т. Д.).

Когда новые данные вводятся в одну или обе из двух таблиц, или данные обновляются в одной или обеих из двух таблиц, или данные удаляются в одной или обеих из двух таблиц --- мне нужно, чтобы эти данные были то же самое в tblContacts.

Я предполагаю, что лучший способ - это сделать триггер, но если есть способ получше, я буду рад научиться.

Пока что у меня есть триггер:

CREATE TRIGGER ContactsTrigger 
ON [dbo].[tblData]
FOR UPDATE
AS
    INSERT INTO dbo.Contacts (LastName, FirstName, MiddleName, 
                              EmailAddress, HomePhone, MobilePhone, 
                              Address, City, StateProvince, ZIPPostal, 
                              id, ContactIDType)
        SELECT
            LastName, FirstName, MiddleName, 
            EmailAddress, HomePhone, MobilePhone, 
            Address, City, StateProvince, ZipPostal, 
            ID, ContactIDType
        FROM 
            INSERTED
GO

Кажется, это работает для вставки новой записи, но когда я изменяю данные в существующей записи в tblData, она просто вставляет новую запись в Contacts, так что у меня затем появляется повторяющаяся запись разных видов (старое значение и новое значение). Мне это не нужно - мне нужно, чтобы он ОБНОВЛЯЛ запись в таблице Contacts при изменении данных из той же записи в tblData, в то же время продолжая вставлять НОВЫЕ записи или удалять записи на основе введенных новых записей или старые записи удалены в tblData.

Мне кажется очень глупым просить об этом, поскольку я уверен, что это должно быть легкое решение, но я очень новичок в этом и готов выглядеть глупо, чтобы получить небольшую помощь или руководство. = D


  • Есть ли связь между tblData и контактами? Другими словами, когда вы обновляете tblData, как вы узнаете, какую запись нужно обновить в Контактах? 19.11.2017
  • Привет, Алекс. У меня есть ID внешнего ключа в контактах с PK ID tblData. 19.11.2017

Ответы:


1

Вам нужно будет решить, обновлять или вставлять - в зависимости от введенных значений. Затем в вашем триггере у вас должны быть два отдельных оператора - один для вставки (как вы уже сделали), а другой для обновления.

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

CREATE TRIGGER ContactsTrigger 
ON [dbo].[tblData]
FOR UPDATE
AS
    IF ....... (you need to somehow decide whether to update or insert here) ......
    BEGIN
        INSERT INTO dbo.Contacts (LastName, FirstName, MiddleName,     
                                  EmailAddress, HomePhone, MobilePhone, 
                                  Address, City, StateProvince, ZIPPostal, 
                                  id, ContactIDType)
            SELECT
                LastName, FirstName, MiddleName, 
                EmailAddress, HomePhone, MobilePhone, 
                Address, City, StateProvince, ZipPostal, 
                ID, ContactIDType
            FROM 
                INSERTED
    END
    ELSE BEGIN
        UPDATE dbo.Contacts
        SET LastName = i.LastName, FirstName = i.FirstName, 
            MiddleName = i.MiddleName, EmailAddress = i.EMailAddress, 
            HomePhone = i.HomePhone, MobilePhone = i.MobilePhone, 
            Address = i.Address, City = i.City, 
            StateProvince = i.StateProvince, ZipPostal = i.ZipPostal, 
            ContactIDType = i.ContactIDType
        FROM
            Inserted i            
        WHERE 
            -- define some condition that links the rows in the `Inserted` pseudo table 
            -- with the `Contacts` table - I just **guessed** it might be the `ID` column
            ID = I.ID  


    END
GO

Итак, сейчас ваша задача - выяснить, какое условие вы можете проверить, чтобы узнать, является ли строка новой и должна ли она быть вставлена ​​или обновлена.

  • Может быть, значение ID уже существует в Contacts?
  • Может быть, комбинация имени и фамилии? Другие колонки?

ОБНОВЛЕНИЕ: если ваш столбец ID является решающим фактором, попробуйте следующее: сначала он обновляет все те строки в dbo.Contacts, которые уже есть в таблице, а затем вставляет те, которые не являются частью dbo.Contacts:

CREATE TRIGGER ContactsTrigger 
ON [dbo].[tblData]
FOR UPDATE
AS
    -- first update existing rows in dbo.Contacts with values from "Inserted"...
    UPDATE dbo.Contacts
    SET LastName = i.LastName, FirstName = i.FirstName, 
        MiddleName = i.MiddleName, EmailAddress = i.EMailAddress, 
        HomePhone = i.HomePhone, MobilePhone = i.MobilePhone, 
        Address = i.Address, City = i.City, 
        StateProvince = i.StateProvince, ZipPostal = i.ZipPostal, 
        ContactIDType = i.ContactIDType
    FROM
        Inserted i            
    WHERE 
        -- define some condition that links the rows in the `Inserted` pseudo table 
        -- with the `Contacts` table - I just **guessed** it might be the `ID` column
        ID = I.ID  

    -- then secondly insert new rows into dbo.Contacts 
    INSERT INTO dbo.Contacts (LastName, FirstName, MiddleName,     
                              EmailAddress, HomePhone, MobilePhone, 
                              Address, City, StateProvince, ZIPPostal, 
                              id, ContactIDType)
        SELECT
            LastName, FirstName, MiddleName, 
            EmailAddress, HomePhone, MobilePhone, 
            Address, City, StateProvince, ZipPostal, 
            ID, ContactIDType
        FROM 
            INSERTED i
        WHERE
            i.ID NOT IN (SELECT ID FROM dbo.Contacts);

GO
19.11.2017
  • Спасибо, Марк - Да, значение ID уже будет в Контактах. Я попробую то, что у вас есть, и дам вам знать. Спасибо за вашу помощь! 19.11.2017
  • Я адаптировал то, чем вы поделились, но ему по какой-то причине не нравится Else - я использовал IF NOT EXISTS (Select ....) и Insert into Contacts, затем ELSE Начните с остального из того, что вы предложили ... И все хорошо, за исключением того, что Else отмечает неправильный синтаксис. Что мне не хватает? Прости. Я серьезно нахожусь в SQL Server только через неделю или две из Access, поэтому я не совсем уверен, как это построить. 19.11.2017
  • @cheryl: попытался обновить мой ответ фрагментом кода, который сначала обновляет существующие строки, а затем вставляет те, которых еще нет в таблице 19.11.2017
  • Новый код отлично выполнялся и обновлял записи в Контактах, но не вставлял новые данные в Контакты. Не уверен, почему ... Где i.ID Not In (Select ID From dbo.Contacts) должен был это сделать, я думаю. ... Кстати, я должен разрешить нули в идентификаторе, так как я также привожу данные в контакты из другой таблицы, что означает, что идентификатор (tblData) будет нулевым в этих случаях. 19.11.2017
  • Я взял Where i.ID Not In - полностью отключил, чтобы посмотреть, будет ли он вставляться без него, и это не так ... 19.11.2017
  • Все заработало! Я разделил ваш новый код на два триггера, один для вставки, а другой для обновления, и вынул предложение Where из триггера вставки, и теперь он отлично работает. Спасибо за вашу помощь! 19.11.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..