【问题标题】:SQL Server triggers aren't working with Linq to SQL on ASP.NETSQL Server 触发器不适用于 ASP.NET 上的 Linq to SQL
【发布时间】:2013-05-16 08:33:42
【问题描述】:

我的同事正在制作ASP.NET Web Forms 应用程序来收集数据。我正在管理它的SQL Server 数据库。基于数据库,他使用Linq to SQL 将对象制作成Web 表单。他希望我在 Osoby 进行记录以更改 dataDodania 与对象的生成日期和 dataModyfikacji 与上次更新日期。有 PL/SQL 方面的经验,我为此做了简单的触发器。问题是,当我很好地在SQL Server Management Studio 2008 中运行 SQL 语句时,触发器工作,但在应用程序中使用时 - 它们被省略,不需要进行更改。下面是触发器的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

【问题讨论】:

    标签: asp.net sql-server linq-to-sql


    【解决方案1】:

    这可能对你有帮助(如果 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
    

    【讨论】:

    • 现在我使用default ( GETDATE() ) 约束dataDodania。仍然使用 UPDATE 的触发器,但不知道用什么来更改它...
    猜你喜欢
    • 2021-11-08
    • 2011-04-17
    • 1970-01-01
    • 2010-11-17
    • 2012-07-10
    • 1970-01-01
    • 2020-06-15
    • 2014-07-05
    • 1970-01-01
    相关资源
    最近更新 更多