Запускать обновление значения после операций вставки и удаления? - PullRequest
0 голосов
/ 13 октября 2019

У меня есть действие из моего класса SQL Server, и мне не хватает только этого триггера для его завершения.

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

После оператора вставки всегда сохраняйте значения в последовательности, например, первая запись равна 0, следующая должна быть 1, и все идет.

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

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

Но не повезло с оператором delete.

Вот что у меня есть для триггера:

CREATE TRIGGER tg_sequencial 
ON Telefone
AFTER INSERT, UPDATE
AS
BEGIN
    DECLARE @vSequencial_Ins INT, @vSequencial_Del INT

    SELECT @vSequencial_Ins = inserted.Sequencial FROM inserted
    SELECT @vSequencial_Del = deleted.Sequencial FROM deleted

    -- Check if it is an insert operation
    if(@vSequencial_Ins IS NOT NULL AND @vSequencial_Del IS NULL)
    begin
        update Telefone set Sequencial = NEXT VALUE FOR dbo.Sequencial
        from Telefone tel
        join inserted i on i.IdPessoa = tel.IdPessoa
    end
    -- Check if it is an delete operation
    else if(@vSequencial_Ins IS NULL AND @vSequencial_Del IS NOT NULL)
    begin
        alter sequence dbo.Sequencial
        restart with 0
    end
end

И вот код последовательности:

CREATE SEQUENCE dbo.Sequencial
    START WITH 0
    INCREMENT BY 1
    NO CACHE
    ;
GO

В моей таблице телефонии есть следующие значения:

Sequencial smallint not null [PK]
IdPessoa int not null[PFK],
IdTipoTelefone tinyint not null [FK],
NumeroTelefone int not null,
DDD tinyint not null

РЕДАКТИРОВАТЬ: Получил триггер вставки работает нормально после изменения кода с:

update Telefone set Sequencial = NEXT VALUE FOR dbo.Sequencial

На:

update Telefone set Sequencial = NEXT VALUE FOR dbo.Sequencial
from Telefone tel
join inserted i on i.IdPessoa = tel.IdPessoa

Теперь влияет только навыбранная строка ввместо увеличения всех полей.

...