Триггеры SQL Server не работают с Linq to SQL в ASP.NET
Мой коллега по работе делает ASP.NET Web Forms
приложение для сбора данных. Я управляю SQL Server
База данных этого. На основе базы данных он создает объекты для веб-форм, используя Linq to SQL
, Он хотел, чтобы я сделал recodrds в Osoby, чтобы изменить dataDodania
с датой генерации объекта и dataModyfikacji
с датой последнего обновления. Имея опыт работы с PL/SQL, я сделал для этого простые триггеры. Проблема в том, что триггеры работают, когда я запускаю операторы SQL в SQL Server Management Studio 2008
приятно, но при использовании в приложении - они опускаются, вносить изменения не нужно. Вот триггеры кода SQL:
CREATE TRIGGER [dbo].[DodanieOsoby]
ON [dbo].[Osoby]
INSTEAD OF INSERT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
INSERT INTO Osoby(dataDodania, dataModyfikacji, loginId, rola, imie, imieDrugie, nazwisko, plec, wiek,pESEL,wyksztalcenie,opieka,ulica, nrDom, nrLokal, miejscowosc, obszar, kodPoczty, telefonKontakt, telefonStacjo, email, zatrudnienie, stanowisko, przedsiebiorstwo)
SELECT GETDATE(), GETDATE(), loginId, rola, imie, imieDrugie, nazwisko, plec, wiek, pESEL, wyksztalcenie,opieka,ulica, nrDom, nrLokal, miejscowosc, obszar, kodPoczty, telefonKontakt, telefonStacjo, email, zatrudnienie, stanowisko, przedsiebiorstwo
FROM inserted
END
И для ОБНОВЛЕНИЯ Osoby
...
CREATE TRIGGER [dbo].[AktualizacjaOsoby]
ON [dbo].[Osoby]
AFTER UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
UPDATE Osoby
SET dataModyfikacji = GETDATE()
WHERE id in
(SELECT DISTINCT id from Inserted)
END
1 ответ
Возможно, это будет полезно для вас (если dbo.Osoby is view) -
ALTER TRIGGER dbo.trg_IOIU_vw_WorkOut
ON dbo.vw_WorkOut
INSTEAD OF INSERT, UPDATE
AS BEGIN
SET NOCOUNT ON
SET XACT_ABORT ON
DECLARE
@WorkOutID BIGINT
, @DateOut DATETIME
, @EmployeeID INT
DECLARE workout CURSOR LOCAL READ_ONLY FAST_FORWARD FOR
SELECT
WorkOutID
, DateOut
, EmployeeID
FROM INSERTED
OPEN workout
FETCH NEXT FROM workout INTO
@WorkOutID
, @DateOut
, @EmployeeID
WHILE @@FETCH_STATUS = 0 BEGIN
IF NOT EXISTS(
SELECT 1
FROM dbo.WorkOut
WHERE WorkOutID = @WorkOutID
)
BEGIN
INSERT INTO dbo.WorkOut
(
EmployeeID
, DateOut
)
SELECT
@EmployeeID
, @DateOut
SELECT SCOPE_IDENTITY() -- if you use LINQ need return new ID to client
END
ELSE BEGIN
UPDATE dbo.WorkOut
SET
EmployeeID = @EmployeeID
, DateOut = @DateOut
WHERE WorkOutID = @WorkOutID
END
FETCH NEXT FROM workout INTO
@WorkOutID
, @DateOut
, @EmployeeID
END
CLOSE workout
DEALLOCATE workout
END