标签: sql-server-2019

将凭证秘密与已知值进行比较

假设我有一个带有特定秘密的 SQL Server凭据保存在数据库中。我只想在数据库中保存的秘密与实际秘密不同时修改凭据。

有时,一个例子很好,所以看看这个:

CREATE CREDENTIAL [MyCred]
WITH IDENTITY = N'DOMAIN\User'
    , SECRET = N'some_password';
Run Code Online (Sandbox Code Playgroud)

因此,在的密码DOMAIN\User从 更改为 后,我需要更新密钥,但前提是存储的值不匹配。即我不想盲目地删除并重新创建凭据。some_passwordsome_new_password

通过服务器主体,我可以使用该LOGINPROPERTY([login_name], 'PasswordHash')函数来获取存储在主数据库中的加密密码的哈希版本,但这似乎不适用于凭据。

sql-server credentials sql-server-2019

5
推荐指数
1
解决办法
638
查看次数

如何从每日交易表(客户、发票、付款)检索(借方、贷方和余额)完整和日期范围)

有 3 个表:客户、发票和付款。带有发票和付款表的客户链接。问题是,需要检索报表明智的借方、贷方和余额。主要问题是未从日期范围获得期初余额。我提供带有查询的示例数据。

客户表:

(插入新客户时,如果他们有未分配余额与期初余额,否则保留空白(空))

CREATE TABLE BASE_Customer
(
    CustomerId INT IDENTITY(1,1),
    CustomerName VARCHAR(45),
    SalesOpeningBalance MONEY NULL,
    PRIMARY KEY(CustomerId)
)

INSERT INTO BASE_Customer (CustomerName, SalesOpeningBalance) VAlUES ('Ricky', 2500) -- with opening balance.
INSERT INTO BASE_Customer (CustomerName) VAlUES ('Smith') -- without opening balance.
Run Code Online (Sandbox Code Playgroud)

发票表:

CREATE TABLE BASE_Invoice
(
    InvoiceId INT IDENTITY(1,1),
    InvoiceDate DATE,
    CustomerId INT,
    Total MONEY,
    PRIMARY KEY(InvoiceId)
)

INSERT INTO BASE_Invoice (InvoiceDate, CustomerId, Total) VALUES ('2022-01-01', 1, 500) -- Ricky 
INSERT INTO BASE_Invoice (InvoiceDate, CustomerId, Total) VALUES ('2022-01-02', 2, …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012 sql-server-2019

5
推荐指数
1
解决办法
1292
查看次数

单个谓词检查约束提供恒定扫描,但两个谓词约束则不提供

我可以在 AdventureWorks 表 Person.Person 上创建以下约束:

ALTER TABLE Person.Person ADD CONSTRAINT ConstantScan CHECK (LastName <> N'Doesn''t Exist')

这告诉 SQL Server LastName 的值不能为Doesn't Exist

优化器在以下简单查询中利用了这一点:

SELECT  *
FROM    Person.Person
WHERE   LastName = N'Doesn''t Exist'
Run Code Online (Sandbox Code Playgroud)

由于约束告诉优化器列中没有任何内容可以等于我们正在相等搜索的值(假设有可信约束),因此优化器仅执行持续扫描并且“不执行任何操作”

如果我放弃上面的约束并创建一个稍微不同的约束:

ALTER TABLE Person.Person ADD CONSTRAINT ConstantScan2 CHECK (LastName <> N'Doesn''t Exist' AND FirstName <> N'Doesn''t Exist')

并使用谓词运行查询,其结果将违反检查约束:

SELECT  *
FROM    Person.Person
WHERE   FirstName = N'Doesn''t Exist' AND
        LastName = N'Doesn''t Exist' 
Run Code Online (Sandbox Code Playgroud)

我们通过键查找进行索引查找

但是,如果我跑

SELECT  *
FROM    Person.Person
WHERE   FirstName = N'Doesn''t Exist' …
Run Code Online (Sandbox Code Playgroud)

sql-server constraint optimization sql-server-2019 query-performance

5
推荐指数
1
解决办法
199
查看次数

我可以更改 cdc 架构的所有者吗?

我已使用以下命令在数据库上启用了更改数据捕获 (CDC)exec sys.sp_cdc_enable_db

这将创建一个由cdc用户拥有的新cdc架构

select
    s.*
    , dp.name
from sys.schemas as s
join sys.database_principals as dp
    on dp.principal_id = s.principal_id
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

因为我想利用所有权链接并使用 proc 从此架构中读取数据,所以我可以将所有者更改为dbo吗?

ALTER AUTHORIZATION ON SCHEMA::cdc TO dbo
Run Code Online (Sandbox Code Playgroud)

此命令起作用并更改所有者。但疾病预防控制中心已经启用了一段时间,我担心未来会进一步破坏一些东西。

security change-data-capture owner sql-server-2019 schema-migration

5
推荐指数
1
解决办法
221
查看次数

从 SQL Server 2012 SP1 升级到 SQL Server 2019

我正在升级工作中的内部数据库,我们正在创建一个新的 VM 来托管它。

我看不到生成脚本以导出服务器版本 SQL Server 2019 的 SQL Server 2012 SP1 数据库的选项。对我来说是否更好:

  • 按照当前数据库服务器上SQL Server 2012到SQL Server 2019的升级路径,升级完成后将数据库导出到新服务器。

或者

  • 按原样从 SQL Server 2012 导出数据库,并为可用的最高服务器版本 (2017) 编写脚本。

如果我安装了 SQL Server 2012 SP4,是否会给我一个选项来选择服务器版本 SQL Server 2019 的脚本?

提前感谢您的帮助。

sql-server-2012 sql-server-2019

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

更改为兼容级别 150 会使 SQL Server 消耗所有可用内存

我们正在将现有数据库移动到新的 SQL Server 2019 实例。

如果我们将兼容级别更改为 150,则没有任何效果。任务管理器显示 sql server 服务正在消耗所有可用内存并且所有查询超时并显示错误

内部资源池中的系统内存不足,无法运行此查询

RAM 被完全消耗,直到无法运行查询(所有这些都以我提到的上一个错误结束)。我们尝试过 16、32 和 64GB 的 RAM。

任何人都可以提供有关如何调试的任何提示吗?

请注意,这不是查询问题……仅更改兼容级别就足以使 SQL 开始耗尽内存。

即使运行一个简单的标量函数(内部使用多个 Substring 和 cast 调用 - 没有表或视图选择)也足以使其消耗所有可用内存。

sql-server memory functions compatibility-level sql-server-2019

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

如何控制非聚集列存储索引上的分段最小/最大 data_id

给定一个简单的基于行的表,没有 PK 但有一个基于行的聚集索引,如下所示:

create clustered index [CX_PropertyValue] ON [dbo].[PropertyValue] ([PropertyId], [Value])
Run Code Online (Sandbox Code Playgroud)

然后我希望添加一个列存储索引,该索引按与上面的聚集索引相同的顺序进行分段:

create nonclustered columnstore index CS_IX_PropertyValue on dbo.PropertyValue( 
    PropertyId, Value
)
with (drop_existing = on, maxdop = 1); -- maxdop=1 to preserve the order by property 
Run Code Online (Sandbox Code Playgroud)

MaxDop 保留顺序的提示来自:这里

然后使用以下查询报告 PropertyId 列的最小/最大 data_id,并报告 7 个段中的每个段的完整范围:

create view [Common].[ColumnStoreSegmentationView]
as
/*---------------------------------------------------------------------------------------------------------------------
    Purpose: List ColumnStore table segment min/max of columns.

     Source: https://joyfulcraftsmen.com/blog/cci-how-to-load-data-for-better-columnstore-segment-elimination/
             https://dba.stackexchange.com/a/268329/9415

    Modified    By            Description
    ----------  ----------    -----------------------------------------------------------------------------------------
    2020.06.02  crokusek/inet Initial Version 
  ---------------------------------------------------------------------------------------------------------------------*/
select --top 20000000000
       s.Name as SchemaName, 
       t.Name …
Run Code Online (Sandbox Code Playgroud)

sql-server columnstore sql-server-2019

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

一个脚本中的多组 Quoted_identifier 取最后一个?

我正在使用 SQL Server 2019 并发现了一个奇怪的行为。研究并没有让我走得更远。

有人可以解释这种行为吗?

SET QUOTED_IDENTIFIER ON; 
if ((256 & @@options) = 256) print '1- quoted_identifier is on' else print '1- quoted_identifier is off';
BEGIN TRY 
    if ((256 & @@options) = 256) print '2- quoted_identifier is on' else print '2- quoted_identifier is off';
END TRY 
BEGIN CATCH
    if ((256 & @@options) = 256) print '3- quoted_identifier is on' else print '3- quoted_identifier is off';
    -- SET QUOTED_IDENTIFIER OFF
    -- if ((256 & @@options) = 256) print '4- quoted_identifier …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql error-handling sql-server-2019

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

Arab_100_CS_AS_KS_WS_SC_UTF8 和 Latin1_General_100_CS_AS_KS_WS_SC_UTF8 有什么区别?

从 SQL Server 2019 开始,它支持 UTF-8 作为排序规则。但是,根据以下查询:

SELECT COLLATIONPROPERTY('Arabic_100_CS_AS_KS_WS_SC_UTF8', 'CodePage')
SELECT COLLATIONPROPERTY('Latin1_General_100_CS_AS_KS_WS_SC_UTF8', 'CodePage');
Run Code Online (Sandbox Code Playgroud)

两者都返回65001Windows 中的 Unicode代码页。此外,所有新_UTF8排序规则都使用代码页65001

SELECT * FROM sys.fn_helpcollations() WHERE name LIKE '%_UTF8';
Run Code Online (Sandbox Code Playgroud)

usingArabic_100_CS_AS_KS_WS_SC_UTF8Latin1_General_100_CS_AS_KS_WS_SC_UTF8as 排序规则之间有什么区别吗?

sql-server collation utf-8 unicode sql-server-2019

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

由于内存压力,AppDomain 2 SSISDB 被标记为卸载

我有一个存储过程,它将三个大表连接在一起(每个大约有 2000 万条记录)并将记录加载到临时表中。然后将临时表中的数据合并到一个包含大约 6000 万条记录的现有表中。

服务器脱机并显示以下错误消息:

由于内存压力,AppDomain 2 (SSISDB.dbo.[runtime].1] 被标记为卸载。

错误日志消息

使服务器重新联机后,我重新启动了 SQL 服务以清除可能一直存在的所有进程。再次开始工作,它毫无问题地完成了。

我正在运行具有 128GB RAM 的 SQL Server 2019。64 位虚拟服务器上的最大服务器内存为 117964MB。有人在任务管理器中告诉我内存使用率为 94%,这可能是问题所在。但是 SQL 不会占用所有可用内存并保留它吗?所以这似乎是按预期运行的。

sp_WhoIsActive揭示了一些状态为 'Suspended' 和 'Awaiting_Command' 的查询,但我认为这些没有太大影响。128GB 的​​内存似乎足够了,但我想这与它被要求做的工作有关。知道如何排除故障或防止再次发生吗?

服务器的数据驱动器约为1.6TB。连接中的两个较大的数据库是 10GB 的 1900 万行和 13GB 的 2000 万行。那些进入一个临时表,然后MERGE进入一个 26GB 的表,有 5300 万行。

请求的内存授予为 45GB,实际为 30GB。这份工作在正常工作时间之外运行,所以应该没有竞争查询,但我不能 100% 确认有人没有工作到很晚。

我确实注意到它也必须做 a CONVERT_IMPLICIT。这对所需的内存有重大影响吗?

查询计划链接:https : //www.brentozar.com/pastetheplan/?id=SyXaty7xK

sql-server memory sql-server-2019

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