2015-10-23 5 views
0

У меня есть таблица (dbo.membersdatatable), которая имеет несколько столбцов. Я хотел бы, чтобы этот триггер обновил столбец с именем «memberstatus», когда «memberdesignation» обновляется до значения «10» со значения «9».SQL Server After Update Trigger - Single Table - 2 Columns

------- SQL ЗАЯВЛЕНИЕ НИЖЕ ---------------

IF UPDATE([MemberDesignation]) 
--need to make it so it will recognize when memberdesignation = 10 
    UPDATE  dbo.MembersDataTable 
    SET  MemStatus = '0' 
    FROM  dbo.MembersDataTable AS mdtbl 
    INNER JOIN inserted AS i ON i.StudentID = mdtbl.StudentID 
+0

Ваше утверждение не является триггером. Поместите всю логику, которую вы используете в вопрос. –

+0

В качестве общего совета избегайте использования триггеров: это затрудняет техническое обслуживание и эволюцию. Вероятно, у вас есть хранимые процедуры для обновления вашей таблицы, вы должны реализовать эту логику buisness в новой хранимой процедуре: что-то называется «usp_MemberStatusRules» и вызывать этот SP там, где вы взаимодействуете со связанными данными. –

+0

ok, поэтому я новичок в этой статье SQL и это все логика, которую я имею для этого. что бы триггер ИЛИ СП выглядел как нечто подобное? – user5478134

ответ

0

Используйте триггеры ЭКОНОМНО. Например, моя система имеет 138 таблиц, 550 хранимых процедур и всего 28 триггеров. Хотелось бы, чтобы у меня было меньше.

Но если вы решите требуется триггер, он будет выглядеть примерно так:

CREATE TRIGGER [t_MemberDesignationSideEffect] ON [dbo].MembersDataTable 
FOR UPDATE 
AS 

SET NOCOUNT ON 

IF NOT ( UPDATE([MemberDesignation]) ) RETURN 

-- REMINDER: All triggers can and will fire for a set of rows...not just one 

UPDATE mdtbl 
SET  MemStatus = '0' 
FROM inserted i 
    JOIN dbo.MembersDataTable mdtbl on i.StudentID = mdtbl.StudentID 
    JOIN deleted d on d.StudentID = mdtbl.StudentID 
WHERE i.memberdesignation = '10' 
and d.memberdesignation = '9' 

GO 
0

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

Исключен таблица содержит строку, как это было перед оператором UPDATE. Вставка Таблица содержит строку как она is после утверждения UPDATE.

create trigger update_member_status 
on membersdatatable 
for update 
as 
begin 
    declare @old_designation int 
    declare @new_designation int 

    set @old_designation = (select memberdesignation from deleted) 
    set @new_designation = (select memberdesignation from inserted) 

    if (@old_designation = 9 and @new_designation = 10) 
     begin 
      update membersdatatable 
      set memstatus = '0' 
      from membersdatatable as mdtbl 
       inner join inserted as i on i.StudentID = mdtbl.StudentID 
     end 
end 
+0

Это будет работать, но окончательно что-то, что мне не хотелось бы отлаживать ... trigger + magic таблицы ... это сложно для кого-то нового на sql и даже для тех, кто знает об этом –

0

Вы собираетесь обновить статус члена всех строк с memberdesignation = 10

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

Просто позвоните эту процедуру после обновления таблицы

CREATE PROCEDURE USP_MemberStatusRules() 
AS 
    UPDATE  dbo.MembersDataTable 
    SET  MemStatus = '0' 
    WHERE memberdesignation = 10 
    AND ..... 
    AND ..... 
GO