标签: sql-server-2014

将列设置为仅接受负值

无论如何要更改列数据类型,以便它只接受负值?

它是 SQL Server 2014 Azure。

sql-server constraint sql-server-2014 azure-vm

4
推荐指数
1
解决办法
3546
查看次数

INSERT/UPDATE 存储过程本身死锁

我有一个表 (Database2.dbo.OrganizerDataDependencyChange),其中包含有关某些其他表中的行上次更改时间的信息。在这些表中的每一个上,我都有一个触发器,它调用一个存储过程 (Database2.dbo.SaveOrganizerDataDependencyChange),该过程简单地用触发器触发的时间更新 Database2.dbo.OrganizerDataDependencyChange。这些触发器是从 Database1 或 Database2 触发的,因此它们通常是跨数据库调用。

当更新表上的两个不同行时,我在 Database1.dbo.OrganizerDataDependencyChange 表上遇到读写死锁,我不明白为什么。表上只有一个索引,而且它是完全覆盖查询的聚集索引,因此不可能出现查找死锁,尽管 proc 中有两条语句,但我特地将其重写为我所理解的最佳方法避免并发问题,使用 WHERE NOT EXISTS 而不是使用 IF/ELSE 逻辑,所以它不应该从不同的角度出现在这个索引上,对吗?由于它是在触发器和跨数据库中触发的,因此我在重现该问题时遇到了一些困难,我当然可以重现阻塞,但这应该没问题,这正是我所期望的。

有人可以帮助我了解这里发生了什么吗?我可能可以使用 NOLOCK 提示或 applock 修复它,但我仍然不明白为什么会发生这种情况。

这是表:

CREATE TABLE [dbo].[OrganizerDataDependencyChange](
[TableID] [INT] NOT NULL,
[Database] [VARCHAR](150) NOT NULL,
[Updated] [DATETIME] NULL
)
CREATE CLUSTERED INDEX [CX_OrganizerDataDependencyChange_TableID_DB] ON [dbo].[OrganizerDataDependencyChange]
(
[TableID] ASC,
[Database] ASC
)
Run Code Online (Sandbox Code Playgroud)

这是存储过程:

CREATE PROCEDURE [dbo].[SaveOrganizerDataDependencyChange]
(
@TableID int,
@Database varchar(150)
)
AS
BEGIN

SET NOCOUNT ON;

    DECLARE @rowcount INT;

INSERT INTO dbo.OrganizerDataDependencyChange
        ( TableID, [Database], Updated )
SELECT TOP …
Run Code Online (Sandbox Code Playgroud)

sql-server deadlock insert update sql-server-2014

4
推荐指数
1
解决办法
4307
查看次数

当 Flag 值为 1 时触发以阻止更新

当下表中的 Flag 值为 1 时,我需要触发器帮助以防止更新列 Flag 之外的任何列(可以更新):

CREATE TABLE Tmp (Id INT, Type INT, TranDate DATE, Flag INT)
INSERT INTO Tmp VALUES (1, 2, '2017-04-24', 0)
INSERT INTO Tmp VALUES (2, 4, '2017-04-27', 1)
Run Code Online (Sandbox Code Playgroud)

我已尝试使用以下代码,但无法正常工作。

CREATE TRIGGER [dbo].[Prevent_Update_Trigger]
ON [dbo].[Tmp]
FOR UPDATE
AS
SET NOCOUNT ON
IF  EXISTS(SELECT NULL FROM dbo.Tmp t JOIN inserted i ON t.Id=i.Id AND t.Flag=1)
BEGIN
RAISERROR('You can not update when Flag value is 1', 16, 1)
ROLLBACK TRAN
SET NOCOUNT OFF
RETURN
END
SET NOCOUNT …
Run Code Online (Sandbox Code Playgroud)

trigger sql-server sql-server-2014

4
推荐指数
1
解决办法
2万
查看次数

SQL 触发器 - 更新计数

所以我需要创建一个触发器,为每个案例创建一个新的证据编号。例如,案例 #1 可以有证据 # 的 1、2、3、4 等等。案例 #2 也可以有证据 # 的 1、2、3 等。

所以我有一个“Case”表(CaseID 为 PK)和一个“Evidence”表(EvidenceNum 为 PK,CaseID 为 FK 和相关属性)

因此,每次我搜索特定的 caseID 时,我都希望填充一个新的“EvidenceID”列。例如证据项目#1、#2 等。所以这些数字可以在每种情况下重复。因此,为什么这不是主键。EvidenceNum 是主键,但最终用户不会看到它。有什么帮助吗??

trigger sql-server sql-server-2014

4
推荐指数
1
解决办法
443
查看次数

在 SSMS 中对更高版本的 SQL Server 进行查询失败?

我在我的计算机上运行了 SQL Server 2014 和一个compatibility_level值为 100的数据库(SQL Server 2008)。我认为这足以在 SSMS 中编写仅适用于 SQL Server 2008 及更低版本的查询,但出于某种原因,SSMS 运行使用OVER (PARTITION BY ...)仅适用于 2012 及更高版本的子句(带有 BETWEEN 参数)的查询。

我们的软件需要与 2008 R2 及更高版本兼容。如果我编写的查询与 2008 R2 不兼容,是否有我可以更改的设置会导致我的查询在 SSMS 中失败?

ssms sql-server-2014

4
推荐指数
1
解决办法
814
查看次数

了解更新期间的非聚集索引锁定

设置脚本

CREATE TABLE t2 (   [col1] INT, [col2] INT  );

DECLARE @int INT;
SET @int = 1;

WHILE (@int <= 1000) 
BEGIN
    INSERT INTO t2 
        ([col1], [col2])
    VALUES (@int*2, @int*2);
    SET @int = @int + 1;
END
GO
create clustered index cl on t2(col1)
create  index ncl on t2(col2)
Run Code Online (Sandbox Code Playgroud)

我运行一个简单的更新并在读提交隔离级别保持事务打开。

begin tran
update t2 set [col2]=[col2]+1  where col1=6
Run Code Online (Sandbox Code Playgroud)

如果我在另一个会话中检查 sp_lock,我会得到以下结果

在此处输入图片说明

我想了解的是非聚集索引(indid 2)上的键锁。为什么非聚集索引上有两个键锁?

如果我检查第 248 页上的 dbcc 页面,我可以找到明显的一个 ((1bfceb831cd9)),它是记录 6 的条目的锁,该条目已更改为 7。下面 DBCC PAGE 的输出

在此处输入图片说明

我想了解的是另一个键锁(5ebca7ef4e2c)的目的是什么以及它的锁定是什么。

sql-server locking sql-server-2014

4
推荐指数
1
解决办法
1123
查看次数

在 SQL Server 中更改服务帐户密码 - 澄清

我们拥有使用相同 AD 级别服务帐户的 SQL Server 服务和 SQL Server 凭据。

由于最近的安全更改,我们需要在 AD 级别更改服务帐户密码。

在这个阶段 :

如果我先用新密码更改我的 SQL Server 凭据密码,它会直接应用于使用相同服务帐户的 SQL Server 服务帐户吗?

如果有任何机会:

我们是否需要先在配置管理器中更改 SQL Server 帐户,然后再更改凭据帐户密码?

在此处输入图片说明

请说清楚。

sql-server password sql-server-2014

4
推荐指数
1
解决办法
4546
查看次数

Windows Server 2012 R2 Essentials 和 SQL Server 2014

首先,我不是专业的 IT 人员。我从戴尔为我们的极小型企业购买了一台服务器。它附带已安装的 Windows Server 2012 R2 Essentials。请注意,我得到这台服务器的主要原因是我们使用的一个设计软件必须利用 SQL Server,以便所有工作站共享数据文件。软件公司来为我进行设置并说我们无法在域控制器上安装 SQL Server 2014(对于为什么我仍然有点不知所措)。

我的问题如下:

– 有没有办法格式化服务器并重新安装 WS 2012 R2 E 而不将其设置为域控制器,以便 SQL Server 2014 可以工作?

其他信息,如果它可能相关:

  • 该服务器是新的,上面没有相关信息或数据,因此可以擦除它(假设这意味着在其上重新安装 WS)。

  • 这是一款 AutoDesk 产品。

  • 我们正在使用 Microvellum。

sql-server installation sql-server-2014

4
推荐指数
1
解决办法
1092
查看次数

fetch 中的隐式转换

在研究不同的查询计划以提高性能时,我注意到 FETCH 正在隐式转换为bigint.

示例表和查询:

CREATE TABLE checkPagintion
(
    Id INT NOT NULL PRIMARY KEY CLUSTERED,
    Name NVARCHAR(100)
 )

 DECLARE @paramPageNumber AS INT,
         @paramPageSize AS INT;

 SELECT *
 FROM checkPagintion
 ORDER BY Id
 OFFSET @paramPageNumber ROWS
 FETCH NEXT @paramPageSize ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

此查询的执行计划:

隐式转换

我的问题:我应该对所有分页查询使用 bigint 吗?如果我使用 int 会不会有问题,因为implict_conversion 以性能低下着称?

sql-server type-conversion offset-fetch paging sql-server-2014

4
推荐指数
1
解决办法
149
查看次数

对于非 PK 唯一标识符,我应该使用索引还是唯一键?

使用 Sql Server 2014,我有几个表,其中 PK 字段是 int,但我也有一个需要查询的 UniqueIdentifier 字段。该字段将始终是唯一的。

我正在为这些添加索引,并且可以选择IndexUnique Key

选择其中一个有什么好处吗?

uniqueidentifier index-tuning sql-server-2014

4
推荐指数
2
解决办法
1177
查看次数