1

次の SQL Server テーブルがあります。

CREATE TABLE [dbo].[Logins](
    [LoginID] [int] IDENTITY(1,1) NOT NULL,
    [AbonnementID] [int] NOT NULL,
    [Zeitpunkt] [datetime] NULL,
    [IPAdresse] [nvarchar](255) NULL,
    [IstLogout] [bit] NULL,
 CONSTRAINT [PK_Logins] PRIMARY KEY CLUSTERED 
(
[LoginID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,     
ALLOW_ROW_LOCKS      =     ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Logins]  WITH CHECK ADD  CONSTRAINT [FK_Logins_Abonnements] FOREIGN([AbonnementID])
REFERENCES [dbo].[Abonnements] ([AbonnementID])
GO

ALTER TABLE [dbo].[Logins] CHECK CONSTRAINT [FK_Logins_Abonnements]
GO

したがって、ChangeLog に書き込むトリガーを作成しました。

CREATE TRIGGER [dbo].[LoginsChangeLog]
ON [dbo].[Logins]
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
    DECLARE @LoginID INT
    DECLARE @TypID INT

    SET @TypID = (SELECT ChangeLogTables.ChangeLogTableID FROM ChangeLogTables WHERE ChangeLogTable = 'Logins')
    IF EXISTS(SELECT * FROM inserted) AND NOT EXISTS(SELECT * FROM deleted)
    BEGIN
        SET @LoginID = (SELECT inserted.LoginID FROM inserted)
        INSERT INTO ChangeLog(ChangeLogTableID,ChangeLogTypeID,PrimaryKey) VALUES(@TypID,1, @LoginID)
    END

    IF EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted)
    BEGIN
        SET @LoginID = (SELECT inserted.LoginID FROM inserted)
        INSERT INTO ChangeLog(ChangeLogTableID,ChangeLogTypeID,PrimaryKey) VALUES(@TypID,2, @LoginID)
    END

    IF NOT EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted)
    BEGIN
        SET @LoginID = (SELECT deleted.LoginID FROM deleted)
        INSERT INTO ChangeLog(ChangeLogTableID,ChangeLogTypeID,PrimaryKey) VALUES(@TypID,3, @LoginID)
    END
END

テーブルに行を追加することは問題ありません。トリガーは正常に完了しますが、Nhibernate-Framework でテーブルを削除しようとすると、例外が発生します。

更新クエリを実行できませんでした [SQL: AbonnementID=? のログインから削除しますか? とツァイトプンクト

ここに私のC#コードがあります:

    public void Cleanup(long Id, DateTime time)
    {
        var hqlBuilder = new StringBuilder();

        hqlBuilder.Append("DELETE Login AS login");
        hqlBuilder.Append(" WHERE login.Abonnement.AbonnementId = :Id");
        hqlBuilder.Append(" AND login.Zeitpunkt < :time ");


        CurrentSession.CreateQuery(hqlBuilder.ToString())
            .SetParameter("Id", Id)
            .SetParameter("time", time)
            .ExecuteUpdate();

    }

トリガーを削除すると、すべて正常に動作しますが、トリガーは自分の仕事をして Changelog テーブルに書き込む必要があります

4

1 に答える 1