SQL使用触发器填充新表

时间:2015-02-18 21:09:46

标签: mysql sql-server triggers sql-update

嘿所有,所以我创建了一个名为ProductsAudit的表,如下所示:

CREATE TABLE ProductsAudit
(
 AuditID INT NOT NULL PRIMARY KEY,
 ProductID INT NOT NULL,
 CategoryID INT NULL,
 ProductCode VARCHAR(10) NOT NULL,
 ProductName VARCHAR(255) NOT NULL,
 ListPrice MONEY NOT NULL,
 DiscountPercent MONEY NOT NULL,
 DateUpdated DATETIME NULL
);

ProductsAudit表几乎与另一个名为Products的表相同:

ProductID (PK, int, NOT NULL)
CategoryID (FK, int, NULL)
ProductCode (varchar(10), NOT NULL)
ProductName(varchar(255), NOT NULL)
Description(Text, NOT NULL)
ListPrice(money, NOT NULL)
DiscountPercent(money, NOT NULL)
DateAdded(datetime, NULL)

接下来我创建了一个名为Products_UPDATE的触发器,它应该在Products中的一行更新后将Products表中的数据插入到ProductsAudit表中。

CREATE TRIGGER Products_UPDATE
ON Products
AFTER UPDATE
AS
    INSERT INTO ProductsAudit (AuditID, ProductID, CategoryID, ProductCode, 
                      ProductName, ListPrice, DiscountPercent, DateUpdated)
    SELECT  
      i.ProductID, i.ProductID, i.CategoryID, i.ProductCode, 
      i.ProductName, i.ListPrice, i.DiscountPercent, i.DateAdded
  FROM inserted i
  JOIN ProductsAudit pa ON pa.ProductID = i.ProductID

现在,我假设我正在构建错误的触发器,因为它似乎无法正常工作。例如,我可以更新我的产品表:

UPDATE PRODUCTS
SET ProductCode = 'ABC1233'
WHERE ProductID = 18;
SELECT * FROM Products;
SELECT * FROM ProductsAudit;

产品中的行正在正确更新,但我没有将任何数据插入到ProductsAudit表中。

有谁知道我做错了什么?任何帮助将不胜感激!谢谢!

3 个答案:

答案 0 :(得分:2)

为什么要在触发器中加入“ProductsAudit”?这引起了这个问题。

答案 1 :(得分:1)

SELECT  
      i.ProductID, i.ProductID, i.CategoryID, i.ProductCode, 
      i.ProductName, i.ListPrice, i.DiscountPercent, i.DateAdded
  FROM inserted i
  JOIN ProductsAudit pa ON pa.ProductID = i.ProductID

仅当产品ID已存在于审计表中时,才会插入记录。

就个人而言,我还会添加一列来告诉您哪个用户进行了更改。如果事情变得很糟糕,那么了解导致问题的用户或应用程序会很有帮助。

为什么AuditID,ProductID的数据相同?有两个领域有什么意义?

答案 2 :(得分:0)

你承诺了吗?如果你不这样做,你可能无法看到审计。你可以回滚或承认吗?你在使用什么数据库?