Как создать триггер SQL для обновления поля даты в одной таблице при обновлении другой таблицы - PullRequest
0 голосов
/ 21 января 2019

Я хочу создать триггер в моей базе данных, который должен запускаться при обновлении таблицы 'Valve'.

В рамках триггера должно произойти следующее:

  1. Таблица ME должна создаваться или обновляться в соответствии с таблицей схемы клапана [PnPID, Position X / Y / Z, LineNumberTag, Tag, Spec.]
  2. Вся информация из существующей таблицы Valve, для копирования / обновления в таблицу ME

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

Пожалуйста, помогите мне создать такой триггер? Я новичок в SQL.

В моей таблице ME.Valve я хочу добавить другие столбцы с новой информацией, которую я не хочу отображать в таблице Valve (не портите ее). Я прилагаю картинку с существующей таблицей Valve. Итак, я хочу скопировать из таблицы «Valve_PNP» в моей таблице SQL_P3D_Test_ME, например, только столбец «LineNumberTag», «Tag», но при изменении значения из таблицы «Valve_PNP» столбец «LineNumberTag», «Tag» изменить, чтобы изменить и в мою вкладку SQL_P3D_Test_ME автоматически. И в моей таблице SQL_P3D_Test_ME добавьте новый столбец для экзамена Made By in witch, я вставляю информацию вручную в строку перед каждым клапаном. Это возможно?

Это то, что я хочу, в таблице "dbo.Source Tabel" у вас есть одна строка, в которой у вас есть информация в столбцах "TextColumn", "ValueColumn" и т. Д. Для начала эта информация будет скопирована в таблицу [me]. [Таблица назначения], но когда информация в табель "dbo.Source Tabel", например, в столбце "TextColumn", меняется с "тестовой вставки и обновляется без изменения данных" на "Marius", чтобы обновляться в табеле [me]. [Пункт назначения Таблица] только эту информацию и не добавлять новую строку. И так для каждого столбца.

enter image description here

Я использую Microsoft SQL Server Management Studio

enter image description here

1 Ответ

0 голосов
/ 21 января 2019

Я предлагаю добавить триггер в таблицу «Valve», которая содержит обновление таблицы «ME.Valve». Дайте мне знать, если я напишу образец синтаксиса.

Вот пример моего решения ..

USE [SpecifyYourDatabaseHere]

CREATE TABLE dbo.SourceTable
    (
    SourcePrimaryKeyID INT IDENTITY PRIMARY KEY,
    TextColumn VARCHAR(2048),
    ValueColumn DECIMAL(18,3),
    NumberColumn INT
    )

CREATE TABLE [me].[DestinationTable]
    (
    DestinationPrimaryKeyID INT IDENTITY PRIMARY KEY,
    SourcePrimaryKeyID INT,
    TextColumn VARCHAR(2048),
    ValueColumn DECIMAL(18,3),
    NumberColumn INT,
    ActionType VARCHAR(100),
    CreatedDate AS GETDATE(), -- Default to current date
    CreatedDatabaseUser AS SUSER_SNAME()
    )

GO

-- You will need an insert, update and delete trigger.

-- INSERT TRIGGER

-- This trigger will insert any new records into the destination table.
CREATE TRIGGER [dbo].[SourceTable_Insert]
ON [dbo].[SourceTable]
FOR INSERT

AS 

INSERT INTO [me].[DestinationTable] 
    (
    SourcePrimaryKeyID,
    TextColumn,
    ValueColumn,
    NumberColumn,
    ActionType
    )
SELECT  INSERTED.SourcePrimaryKeyID,
        INSERTED.TextColumn,
        INSERTED.ValueColumn,
        INSERTED.NumberColumn,
        'Insert' AS ActionType
FROM    INSERTED

GO

-- UPDATE TRIGGER

-- Conditional Update Trigger : This trigger will only insert data in destination of any of the values in the data columns has changed (Saves space).
CREATE TRIGGER [dbo].[SourceTable_Update]
ON [dbo].[SourceTable]
FOR UPDATE

AS 

INSERT INTO [me].[DestinationTable] 
    (
    SourcePrimaryKeyID,
    TextColumn,
    ValueColumn,
    NumberColumn,
    ActionType
    )
SELECT  INSERTED.SourcePrimaryKeyID,
        INSERTED.TextColumn,
        INSERTED.ValueColumn,
        INSERTED.NumberColumn,
        'Update' AS ActionType
FROM    INSERTED
        INNER JOIN
            (
            SELECT  SourcePrimaryKeyID,TextColumn,ValueColumn,NumberColumn
            FROM    [me].[DestinationTable]
                    INNER JOIN
                        (
                        SELECT  MAX(DestinationPrimaryKeyID) MaxDestinationPrimaryKeyID,
                                COUNT(1) DestinationRecordCount
                        FROM    [me].[DestinationTable]
                                INNER JOIN
                                    INSERTED ON
                                        [me].[DestinationTable].SourcePrimaryKeyID = INSERTED.SourcePrimaryKeyID
                        GROUP BY
                            [me].[DestinationTable].SourcePrimaryKeyID
                        ) MaxDestinationPrimaryKey ON
                        MaxDestinationPrimaryKey.MaxDestinationPrimaryKeyID = [me].[DestinationTable].DestinationPrimaryKeyID
            ) DestinationData ON
                DestinationData.SourcePrimaryKeyID = INSERTED.SourcePrimaryKeyID
                AND (
                        ISNULL(DestinationData.TextColumn,'') != ISNULL(INSERTED.TextColumn,'') OR 
                        ISNULL(DestinationData.ValueColumn,0) != ISNULL(INSERTED.ValueColumn,0) OR 
                        ISNULL(DestinationData.NumberColumn,0) != ISNULL(INSERTED.NumberColumn,0)
                    )

GO

-- DELETE TRIGGER

-- This trigger will insert any deleted records into the destination table.

CREATE TRIGGER [dbo].[SourceTable_Delete]
ON [dbo].[SourceTable]
FOR DELETE

AS 

INSERT INTO [me].[DestinationTable] 
    (
    SourcePrimaryKeyID,
    TextColumn,
    ValueColumn,
    NumberColumn,
    ActionType
    )
SELECT  INSERTED.SourcePrimaryKeyID,
        INSERTED.TextColumn,
        INSERTED.ValueColumn,
        INSERTED.NumberColumn,
        'Delete' AS ActionType
FROM    INSERTED

GO

-- Test the code..

-- Insert trigger 
INSERT  [dbo].[SourceTable]
SELECT  'test insert and update with no data change',
        123.456,
        1

INSERT  [dbo].[SourceTable]
SELECT  'test insert and update with data changed',
        123.456,
        1

INSERT  [dbo].[SourceTable]
SELECT  'test delete',
        123.456,
        1

-- Update trigger test 1 - no data changed (Must not add record in destination)
UPDATE  [dbo].[SourceTable]
SET     NumberColumn = 1
WHERE   SourcePrimaryKeyID = 1

-- Update trigger test 2 - Data changed (Must add record in destination)
UPDATE  [dbo].[SourceTable]
SET     NumberColumn = NumberColumn + 1
WHERE   SourcePrimaryKeyID = 2

-- Deleted trigger test
DELETE FROM [dbo].[SourceTable]
WHERE   SourcePrimaryKeyID = 3

SELECT  *
FROM    dbo.SourceTable

SELECT  *
FROM    me.DestinationTable
ORDER BY
        SourcePrimaryKeyID,
        DestinationPrimaryKeyID
...