2013-05-16 25 views
0

我的同事正在使ASP.NET Web Forms應用程序收集數據。我正在管理SQL Server數據庫。基於數據庫,他使用Linq to SQL使對象成爲Web窗體。他希望我在Osoby做記錄,以dataDodania作爲對象的生成日期,dataModyfikacji與上次更新的日期相同。在PL/SQL方面有經驗,我爲此做了簡單的觸發器。問題是,當我在SQL Server Management Studio 2008中很好地運行SQL語句時觸發器有效,但在應用程序中使用時 - 它們被省略,不需要進行更改。下面是觸發的SQL代碼:SQL Server觸發器無法與ASP.NET上的Linq to 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 UPDATE ...

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 

回答

0

可能這對你有所幫助(如果dbo.Osoby是視圖) -

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 
+0

對於現在我對'dataDodania'使用'default(GETDATE())'約束。仍然使用'UPDATE'觸發器,但不知道該如何改變它... – wyrdhamster