使用 T-SQL 管理库

问题描述 投票:0回答:1

我用存储过程制作了一个 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)
);


提前致谢

sql sql-server t-sql triggers
1个回答
0
投票

如果您想包含空值,请删除

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;
© www.soinside.com 2019 - 2024. All rights reserved.