唯一索引可用于确保特定值或值集最多有 1 个实例。我的问题是,有没有办法强制一个值或一组值最多有 2 个实例?我知道检查约束中的触发器和标量 UDF。我对这些解决方案不感兴趣。
数据库:SQL Server 2017。
唯一索引可用于确保特定值或值集最多有 1 个实例。我的问题是,有没有办法强制一个值或一组值最多有 2 个实例?我知道检查约束中的触发器和标量 UDF。我对这些解决方案不感兴趣。
数据库:SQL Server 2017。
数据库:SQL Server,2017。
我需要在触发器中强制执行某些业务规则。现在,在您告诉我使用外键之前,请知道规则太复杂,无法通过外键执行。说完这些,让我开始回答我的问题:
如果违反业务规则,这是回滚/取消触发器中的插入/更新的正确方法吗:
CREATE TRIGGER [dbo].[MyTestTrigger]
ON [dbo].[MyTestTable]
AFTER INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF TRIGGER_NESTLEVEL(OBJECT_ID('[dbo].[MyTestTrigger]')) > 1
BEGIN
RETURN;
END
if (condition_is_true) begin
;throw 51000, 'Bad data Message.',1;
end
end
我知道我的问题看起来很简单,但我偶然发现了这篇关于SQL Server 错误处理的“论文”。浏览完之后,我的印象是错误处理非常复杂。我感到困惑的一件事是,我是否需要rollback
在语句之前/之后显式调用该throw
语句?或者throw
本身会回滚更新/插入。根据我的测试,它throw
本身会回滚更新/插入。然而,在微软自己关于触发器的文档中,rollback
包含这样的语句:
USE AdventureWorks2022;
GO
IF OBJECT_ID ('Purchasing.LowCredit','TR') IS NOT NULL
DROP TRIGGER Purchasing.LowCredit;
GO
-- This trigger prevents a row from being inserted in the Purchasing.PurchaseOrderHeader table
-- when the credit rating of the specified vendor is set to 5 (below average).
CREATE TRIGGER Purchasing.LowCredit ON Purchasing.PurchaseOrderHeader
AFTER INSERT
AS
IF (ROWCOUNT_BIG() = 0)
RETURN;
IF EXISTS (SELECT 1
FROM inserted AS i
JOIN Purchasing.Vendor AS v
ON v.BusinessEntityID = i.VendorID
WHERE v.CreditRating = 5
)
BEGIN
RAISERROR ('A vendor''s credit rating is too low to accept new
purchase orders.', 16, 1);
ROLLBACK TRANSACTION;
RETURN
END;
纳入rollback
真的有必要吗?