次の 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 テーブルに書き込む必要があります