此触发器用于INSERT和UPDATE命令。它不允许在“订单”表中更新或插入记录。使用' productID'或者是' customerID'不包括在数据库中。如果使用不正确的' productID'执行INSERT或UPDATE命令。或' customerID',显示错误消息。
这是我的触发器代码:
AppSettings = new MultiAppSettings(
new DictionarySettings(azureSettings),
new AppSettings());
然后,此代码用于测试它:
CREATE TRIGGER OrdersTblTrigger
ON Orders_tbl
FOR INSERT, UPDATE
AS
BEGIN
DECLARE @ProdID VARCHAR(10),
@CustID VARCHAR(10)
SET @ProdID = (SELECT Prod_ID FROM inserted)
SET @CustID = (SELECT Cust_ID FROM inserted)
IF @ProdID != (SELECT Prod_ID FROM Orders_tbl)
AND @CustID != (SELECT Cust_ID FROM Orders_tbl)
BEGIN
PRINT 'That ID does not exist in the database!
Please try again.'
END
END
第二个值是我正在检查的CustomerID。那' 1'在数据库中不存在。
但是,当我运行它时,我得到:
Msg 512,Level 16,State 1,Procedure OrdersTblTrigger,第14行 子查询返回的值超过1。这是不允许的 子查询跟随=,!=,<,< =,>,> =或当子查询用作 一种表达。声明已经终止。
如果我禁用触发器它工作正常,值将插入到订单表中。所以,实际触发器中有一些东西。任何帮助将不胜感激。
答案 0 :(得分:-1)
您的数据库看起来不太好,因为在订单表中检查了productId和customerId。如果触发器处于活动状态,则无法添加具有新客户/产品ID的订单。您的数据库应该使用Product表和Customer Table进行规范化,并实现下面的触发器
您触发的原始逻辑不正确,因为它只会检查是否存在1个客户或产品ID。
CREATE TRIGGER OrdersTblTrigger
ON Orders_tbl
FOR INSERT, UPDATE
AS
BEGIN
IF EXISTS (SELECT * FROM inserted
LEFT OUTER JOIN products p on Prod_ID= p.id
LEFT OUTER JOIN customers c on Cust_ID= c.id
WHERE c.id is NULL or p.id is NULL
)
BEGIN
PRINT 'That ID does not exist in the database!
Please try again.'
ROLLBACK ;
END
END
如果您认为需要使用当前架构的解决方案,请将IF EXISTS
声部更改为
IF EXISTS (SELECT * FROM inserted i
LEFT OUTER JOIN Orders_tbl p on i.Prod_ID= p.Prod_ID
LEFT OUTER JOIN Orders_tbl c on i.Cust_ID= c.Cust_ID
WHERE c.Cust_ID is NULL or p.Prod_ID is NULL
)