Sql server SQL DML插入触发器
尝试创建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
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;