创建一个触发器,检查数据库中是否存在ID数据值

时间:2015-12-08 01:27:33

标签: sql-server

此触发器用于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。这是不允许的   子查询跟随=,!=,<,< =,>,> =或当子查询用作   一种表达。声明已经终止。

如果我禁用触发器它工作正常,值将插入到订单表中。所以,实际触发器中有一些东西。任何帮助将不胜感激。

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
             )