我用存储过程制作了一个 T-SQL 脚本,但触发器有问题:无法检索插入表中的数据以将它们传输到历史表。
我有 NULL 值。
我已经多次修改我的触发器,但没有任何反应。 我检查了触发器中的条件值,它始终保持为 NULL。 我删除并重新创建数据库更改了一些字段等等。没有任何作用 我仍然被无法工作的触发器所阻塞。
我想检索我在其他表中插入的数据。
CREATE TRIGGER TriHistoLocation
ON TblLouer
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
DECLARE @nom NVARCHAR(50), @prenom NVARCHAR(50), @dateLocation DATE, @titreLivre NVARCHAR(100), @nombreExemplaire INT, @dateModification DATETIME
IF EXISTS (SELECT * FROM inserted)
BEGIN
SELECT TOP 1 @nom = p.nom, @prenom = p.prenom, @dateLocation = l.dateLocation, @titreLivre = livre.titreLivre, @nombreExemplaire = e.nombreExemplaire, @dateModification = GETDATE()
FROM inserted l
INNER JOIN TblPersonne p ON l.idTblPersonne = p.idTblPersonne
INNER JOIN TblComprendre c ON l.idTblLouer = c.idTblLouer
INNER JOIN TblExemplaire e ON c.idTblExemplaire = e.idTblExemplaire
INNER JOIN TblLivre livre ON e.idTblLivre = livre.idTblLivre
WHERE p.nom IS NOT NULL AND p.prenom IS NOT NULL AND l.dateLocation IS NOT NULL AND livre.titreLivre IS NOT NULL AND e.nombreExemplaire IS NOT NULL;
IF (@nom IS NOT NULL AND @prenom IS NOT NULL AND @dateLocation IS NOT NULL AND @titreLivre IS NOT NULL AND @nombreExemplaire IS NOT NULL)
BEGIN
INSERT INTO TblHistoLocation (nom_H, prenom_H, dateLocation_H, titreLivre_H, NombreExemplaireLoue_H, dateModification)
VALUES (@nom, @prenom, @dateLocation, @titreLivre, @nombreExemplaire, @dateModification)
END
END;
IF EXISTS (SELECT * FROM deleted)
BEGIN
SELECT TOP 1 @nom = p.nom, @prenom = p.prenom, @dateLocation = l.dateLocation, @titreLivre = livre.titreLivre, @nombreExemplaire = e.nombreExemplaire, @dateModification = GETDATE()
FROM deleted l
INNER JOIN TblPersonne p ON l.idTblPersonne = p.idTblPersonne
INNER JOIN TblComprendre c ON l.idTblLouer = c.idTblLouer
INNER JOIN TblExemplaire e ON c.idTblExemplaire = e.idTblExemplaire
INNER JOIN TblLivre livre ON e.idTblLivre = livre.idTblLivre
WHERE p.nom IS NOT NULL AND p.prenom IS NOT NULL AND l.dateLocation IS NOT NULL AND livre.titreLivre IS NOT NULL AND e.nombreExemplaire IS NOT NULL;
IF (@nom IS NOT NULL AND @prenom IS NOT NULL AND @dateLocation IS NOT NULL AND @titreLivre IS NOT NULL AND @nombreExemplaire IS NOT NULL)
BEGIN
INSERT INTO TblHistoLocation (nom_H, prenom_H, dateLocation_H, titreLivre_H, NombreExemplaireLoue_H, dateModification)
VALUES (@nom, @prenom, @dateLocation, @titreLivre, @nombreExemplaire, @dateModification)
END
END;
END;
CREATE TABLE TblLivre(
idTblLivre INT IDENTITY(1,1) PRIMARY KEY,
idTblBibliotheque INT,
titreLivre NVARCHAR(100),
FOREIGN KEY (idTblBibliotheque) REFERENCES TblBibliotheque(idTblBibliotheque)
);
CREATE TABLE TblExemplaire(
idTblExemplaire INT IDENTITY(1,1) PRIMARY KEY,
idTblLivre INT,
nombreExemplaire INT,
prixLocation DECIMAL(8,2),
FOREIGN KEY (idTblLivre) REFERENCES TblLivre(idTblLivre)
);
CREATE TABLE TblPersonne(
idTblPersonne INT IDENTITY(1,1) PRIMARY KEY,
idTblRole INT,
nom NVARCHAR(50),
prenom NVARCHAR(50),
telephone NVARCHAR(20),
loginPersonne NVARCHAR(50),
motDePasse NVARCHAR(20),
FOREIGN KEY (idTblRole) REFERENCES TblRole(idTblRole)
);
CREATE TABLE TblLouer(
idTblLouer INT IDENTITY(1,1) PRIMARY KEY,
idTblPersonne INT,
dateLocation DATE,
personneContact NVARCHAR(200),
FOREIGN KEY (idTblPersonne) REFERENCES TblPersonne(idTblPersonne)
);
CREATE TABLE TblComprendre(
idTblComprendre INT IDENTITY(1,1) PRIMARY KEY,
idTblLouer INT,
idTblExemplaire INT,
nombreExemplaireLoue INT,
FOREIGN KEY (idTblLouer) REFERENCES TblLouer(idTblLouer),
FOREIGN KEY (idTblExemplaire) REFERENCES TblExemplaire(idTblExemplaire)
);
提前致谢
如果您想包含空值,请删除
WHERE
和 IF.. IS NOT NULL
检查。
其他问题:
inserted
和 deleted
表中的多行。UNION ALL
在一次插入中完成所有操作。UNION ALL
,您可以 FULL JOIN
插入和删除 ON PrimaryKeyColumns
。Tbl
,我们知道这是一张桌子。CREATE TRIGGER TriHistoLocation
ON TblLouer
AFTER INSERT, UPDATE, DELETE
AS
IF @@ROWCOUNT = 0
RETURN;
SET NOCOUNT ON;
INSERT INTO TblHistoLocation (
nom_H, prenom_H, dateLocation_H, titreLivre_H, NombreExemplaireLoue_H, dateModification
)
SELECT
p.nom,
p.prenom,
l.dateLocation,
livre.titreLivre,
e.nombreExemplaire,
GETDATE()
FROM (
SELECT *
FROM inserted l
UNION ALL
SELECT *
FROM deleted
) l
INNER JOIN TblPersonne p ON l.idTblPersonne = p.idTblPersonne
INNER JOIN TblComprendre c ON l.idTblLouer = c.idTblLouer
INNER JOIN TblExemplaire e ON c.idTblExemplaire = e.idTblExemplaire
INNER JOIN TblLivre livre ON e.idTblLivre = livre.idTblLivre;