我的 SQL Server 数据库中有一个配置表,该表应该只有一行。为了帮助未来的开发人员理解这一点,我想防止添加多于一行的数据。我选择为此使用触发器,如下所示......
ALTER TRIGGER OnlyOneConfigRow
ON [dbo].[Configuration]
INSTEAD OF INSERT
AS
BEGIN
DECLARE @HasZeroRows BIT;
SELECT @HasZeroRows = CASE
WHEN COUNT (Id) = 0 THEN 1
ELSE 0
END
FROM
[dbo].[Configuration];
IF EXISTS(SELECT [Id] FROM inserted) AND @HasZeroRows = 0
BEGIN
RAISERROR ('You should not add more than one row into the config table. ', 16, 1)
END
END
Run Code Online (Sandbox Code Playgroud)
这不会引发错误,但不允许第一行进入。
还有比这更有效/更自我解释的方法可以将可以插入表中的行数限制为 1 吗?我是否缺少任何内置的 SQL Server 功能?
根据标题:在 SQL Server 中,是否在插入的默认约束之前或之后应用了检查约束?
所以采用下表(为简洁起见省略了不必要的列)......
CREATE TABLE [dbo].[Customer](
[CountryCode] [varchar](5) NULL CONSTRAINT [CK_Customer_DefaultCountryCode] DEFAULT ([app].[GetUnknownCountryIsoCountryCode]()),
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
...还有以下检查约束...
ALTER TABLE [admin].[Customer] WITH CHECK
ADD CONSTRAINT [CK_CustomerHasCountryWhenIntercompanyBusinessModel]
CHECK (
([app].[BusinessModelMustHaveCountry]([BusinessModelId]) = (1) AND [app].[CheckCountryCodeExists]([CountryCode]) = (1) OR
[app].[BusinessModelMustHaveCountry]([BusinessModelId]) <> (1))
)
GO
Run Code Online (Sandbox Code Playgroud)
...是否会应用默认约束并在应用检查约束之前填充默认值?
首先让我声明我是 C# 开发人员,而不是 SQL Server DBA,所以请原谅我对 SQL Server 数据库查询执行计划的无知。
我想知道的是对于使用主键和外键从两个或多个表中提取结果以引用它们的存储过程,是否更好的做法是:
我问是因为在 C# 世界中,我们会将关注点分开,因此一个对象或函数将负责连接(在本例中为视图),另一个对象或函数将负责过滤(在本例中为存储过程) )。
在 C# 中,关注点分离通常被认为比性能更重要,直到证明性能已成为代码的严重问题。但是我不知道SQL世界里的东西堆起来了!
performance sql-server stored-procedures execution-plan view query-performance