Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL DML插入触发器_Sql Server - Fatal编程技术网

Sql server SQL DML插入触发器

Sql server SQL DML插入触发器,sql-server,Sql Server,尝试创建dml触发器,该触发器在将新数据插入其他表之前检查列数据是否存在。这是我到目前为止所拥有的 CREATE TRIGGER filter2 ON Sales.CustReviews AFTER INSERT AS IF EXISTS (SELECT * FROM Sales.Orders AS so JOIN sales.CustReviews AS cr ON so.custid = cr.custid WHERE so

尝试创建dml触发器,该触发器在将新数据插入其他表之前检查列数据是否存在。这是我到目前为止所拥有的

CREATE TRIGGER filter2 ON Sales.CustReviews
AFTER INSERT
AS
IF EXISTS (SELECT *
           FROM Sales.Orders AS so
           JOIN sales.CustReviews AS cr ON so.custid = cr.custid
           WHERE  so.Ordershipped = 'no'
          )  

BEGIN
RAISERROR ('Need to place order before posting review', 16, 1);
ROLLBACK TRANSACTION;
RETURN

END;

我希望上述代码失败,因为它没有发货订单,因为默认值设置为“否”。sales.order中只有一个订单,而custid为1。请尝试以下操作:

CREATE TRIGGER filter2 ON Sales.CustReviews
AFTER INSERT
AS
BEGIN
    IF NOT EXISTS (SELECT *
               FROM Sales.Orders AS so
               JOIN sales.CustReviews AS cr ON so.custid = cr.custid
               WHERE so.Ordershipped <> 'no'
              )
        THROW 60000, 'Error Message!', 1;
    RETURN;
END;
GO

BEGIN TRY
    BEGIN TRANSACTION;
    INSERT INTO Sales.CustReviews (custid, comment) VALUES ('2', 'this product sucks');
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
    THROW;
END CATCH;

那么是mysql还是sql server?有细微的差别。请删除不适用的标记。如果请求的客户没有发货订单,则应引发错误。为什么不使用外键约束?这样,只要该客户与至少一个订单关联,客户就可以发布对任何内容的审核?听起来对吗?该审查与任何特定产品/服务/项目无关?不与任何特定订单关联?与客户实际订购的任何东西都没有关联?如果客户有多个订单,如果任何订单尚未发货,他/她仍然无法发表评论?这听起来像是一个注定要失败的系统。@SMor这是正确的,最初我让它按orderid过滤,而不是按订单是否已发货过滤。我只是在玩弄扳机,想让它动起来。
CREATE TRIGGER filter2 ON Sales.CustReviews
AFTER INSERT
AS
BEGIN
    IF NOT EXISTS (SELECT *
               FROM Sales.Orders AS so
               JOIN sales.CustReviews AS cr ON so.custid = cr.custid
               WHERE so.Ordershipped <> 'no'
              )
        THROW 60000, 'Error Message!', 1;
    RETURN;
END;
GO

BEGIN TRY
    BEGIN TRANSACTION;
    INSERT INTO Sales.CustReviews (custid, comment) VALUES ('2', 'this product sucks');
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
    THROW;
END CATCH;