标签: sql-server

在 SQL Server 2016 中结合始终加密和列级加密

我们有使用 SQL Server 2016 加密敏感列数据的要求,并选择了 Always Encrypted(AE) 功能来使用确定性方法加密这些列。

由于 AE 确定性加密不允许对这些加密列进行不等式、范围或 LIKE 查询,因此我们尝试使用对称密钥(列级)加密技术对这些类型的列进行加密。

在某些列(不需要任何不等式、范围或 LIKE 查询)上实现 AE 功能并在需要生成不等式、范围或 LIKE 查询的列上实现对称密钥类型加密是否是一个好习惯?

考虑到性能、安全性和维护性,将 AE 加密和列级加密结合在一个表上是一个好习惯吗?

请专家指教。

sql-server encryption sql-server-2016 always-encrypted

8
推荐指数
1
解决办法
2092
查看次数

从 SQL Server 查询外部 LDAP 服务器

我对查询 LDAP 服务器进行了广泛的研究,但到目前为止还没有解决。所以请高手帮忙

背景:我有一个客户端,其 LDAP 服务器是 OnPremise(虽然面向公众),我在防火墙内有一个 SQL Server(2012 SE)。外部 LDAP 和内部 SQL Server 之间的通信很好,因为我可以互相 ping 通。我还创建了一个远程域帐户,并在 SQL Server 上创建链接服务器时使用了该帐户。我还有我们的内部域控制器,它具有域信任关系。现在,我使用域帐户创建了 2 个链接服务器,但我无法在内部和外部查询 LDAP 服务器。我希望这是有道理的。无论如何,这是我的链接服务器的定义和我收到的错误

[已解决] 链接服务器到内部 LDAP 服务器:这是通过使用 ADuser@domain.com 而不是 domain/ADuser 解决的

USE [master]
GO

EXEC master.dbo.sp_addlinkedserver @server = N'ADSI', @srvproduct=N'Active 
Directory Service Interfaces', @provider=N'ADSDSOObject', 
@datasrc=N'adsdatasource'

EXEC master.dbo.sp_addlinkedsrvlogin 
@rmtsrvname=N'ADSI',@useself=N'False',@locallogin=NULL,
@rmtuser=N'Domain/ADUser',@rmtpassword='########'
Run Code Online (Sandbox Code Playgroud)

错误:

消息 7321,级别 16,状态 2,第 1 行准备查询时出错“SELECT *
FROM 'LDAP://Domain.com/OU=Accounts,DC=Domain,DC=com' --WHERE objectClass = 'User ' " 用于针对链接服务器 "ADSI" 的 OLE DB 提供程序 "ADSDSOObject" 执行。

链接服务器到外部 LDAP 服务器

USE …
Run Code Online (Sandbox Code Playgroud)

sql-server windows linked-server sql-server-2012 active-directory

8
推荐指数
1
解决办法
4397
查看次数

由于临时表,统计信息更新后执行计划错误

存储过程查询有时会在其中一个表上的统计信息更新后得到一个糟糕的计划,但之后可以立即重新编译为好的计划。相同的编译参数。

问题似乎来自在 SP 中创建然后加入的一个小临时表。错误的计划在临时表上有一个警告,即连接列没有统计信息。是什么赋予了?

SQL Server 2016 SP1 CU4,具有 2014 兼容级别

糟糕的计划:

糟糕的计划截图

好计划:

好计划截图

存储过程

USE AppDB
GO
SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
GO
CREATE PROCEDURE [MySchema].[MySP]
    @MyId VARCHAR(50),
    @Months INT
AS
BEGIN

    SET NOCOUNT ON

    SELECT * 
    INTO #MyTemp
    FROM AppDB.MySchema.View_Feeder vf WITH (NOLOCK)
    WHERE vf.MyId = @MyId AND vf.Status IS NOT NULL

    SELECT wd.Col1
         , vp.Col2
         , vp.Col3 
    FROM AppDB.MySchema.View_VP vp WITH (FORCESEEK)
    INNER JOIN #MyTemp wd ON wd.Col1 = vp.Col1
    WHERE vp.Col3 > DATEADD(MONTH, @Months * -1, …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization statistics execution-plan temporary-tables

8
推荐指数
1
解决办法
3266
查看次数

来自 Web 应用程序的连接池中大型“最大连接数”的缺点

我知道如果您根本不池化数据库连接,那么每次需要查询数据库时,您都要承担建立新数据库连接的开销,这会使您的应用程序变慢,并且您可以通过池化来节省该开销。

如果您将最大池大小设置得太小 - 比方说,最多 1 个连接 - 那么它的缺点是您的应用程序必须为所有请求共享该单个数据库连接,并且请求将不得不等待前一个连接完成数据库连接,然后才能从池中获取它并重新使用它。

但是,如果您只是将最大池大小设置得非常大,例如最大 1000 个连接,该怎么办。那么它不应该更倾向于重用连接而不是建立新连接,并且仅在实际需要时才最大化池大小以满足需求吗?

假设未使用的连接在空闲超时后关闭/从池中删除,使连接池大于满足应用程序需求所需的大小有什么缺点?

sql-server connection-pooling

8
推荐指数
3
解决办法
1万
查看次数

SQL Server 的时态表会继续存在吗?

我们正在考虑在应用程序中保存记录历史的不同方法。

部分负责人担心,这是SQL server比较新的特性,微软可能会停止支持。

这些担忧是否合理?
是否有此功能的路线图,说明 Microsoft 打算在未来使用此功能做什么?

sql-server temporal-tables

8
推荐指数
2
解决办法
1170
查看次数

由于 SQL Server 中没有 unsigned int,因此 -2,147,483,648 的标识种子对大表是否更有意义?

我刚刚想到默认的 Identity Seed 是 1。我知道有些表在某个时候会增长到数十亿。int.Min对于这些表,从(-2,147,483,648)开始不是更有意义吗?

这可能只是bigint在 4 年或 8 年内将您的密钥迁移到不同。可以足够相关。

这是常见的吗?感觉很奇怪。有什么我想念的吗?

sql-server identity

8
推荐指数
2
解决办法
1146
查看次数

存储过程出错时为什么会提交部分事务?

我有一个存储过程,它首先声明一些变量,然后包含begin tran;在此之后它对提供的参数执行一些验证(并且每次提供的参数验证失败时都会增加错误计数)。如果没有错误计数,则继续执行 7 次插入。在此之后,它有commit tran;

最近我在列表中添加了第 8 个插入。隐式类型转换意味着某些插入的数据在插入时会被截断。这向 SSMS 屏幕抛出了一个错误,但我发现前 7 个插入已提交,而第 8 个显然没有完成。

我很欣赏我可以包含一个try ... catch块来处理错误,但如果一个显式begin tran;不能使整个工作块自主到commit,那么有什么意义呢?我错过了什么?

我知道我也许可以将我的程序调用包装在那个级别的事务中 - 但是有人可以解释发生了什么以及为什么begin tran当包含在程序主体中时似乎不受尊重吗?如果调用该过程开始一个隐式事务,那么 proc 中的错误步骤不应该回滚受 proc 影响的所有更改 - 即使没有明确包含begin tran在 proc 主体中?

sql-server stored-procedures transaction

8
推荐指数
1
解决办法
957
查看次数

数据库“管理员”是否应该能够深入研究运行时查询性能问题?

我承认每个人的经验和能力都是不同的。话虽如此,我想避免为 DBA 通过行动设定过高(或过低)的期望;似乎是“管理员”。

鉴于:

  • 我是一名深入研究 SQL Server 故障排除和性能问题的开发人员。晚上我拿着一桶爆米花看 Brent Ozar 的视频。
  • 一个有多个部门的公司,这个部门有大约 100 名团队成员
  • 许多客户的数据库有数百万行 ETL
  • 一个小型 DBA 团队,可以处理这些相同的客户。处理 HAG 问题、备份、恢复、为新客户或升级客户创建新部署。

我不是试图证明我自己的观点是正确的。我想调整我的意见或公司其他人的意见。

题:

鉴于上述情况,是否应该期望 DBA 只是一个“管理员”?这是你经常看到的吗?


我进入这部肥皂剧(请参阅我最近的其他问题)时,期望 DBA“有望”深入研究。我开始相信我误解了,我倾向于 DBA - 成为“管理员”。

我欢迎其他人的经验,也许还可以提供关于完善这个问题的建议。

sql-server career

8
推荐指数
1
解决办法
506
查看次数

嵌套 CTE 在某些情况下返回不正确的结果

好的,首先让我说我从以下方面得到了这个问题:

我试图帮助找出问题,但在尝试一步一步调试代码时被难住了。我知道这个问题是由于嵌套的 CTE(因为在调试过程中,如果你将每一步 aka cteX 转储到临时表中,就会获得正确的结果)但不知道它们是如何“在幕后”工作的,我无法在外面以一种明智的方式解释它“它不起作用哟。” 我怀疑这与编译器如何尝试在运行时同时评估它们有关,但没有更多上下文我不能肯定地说。

我的问题只是试图了解它们如何在幕后工作以及它与这种情况有何关系。现在我参与其中,我只想了解这个问题,以便将来可以与之交谈并同时学习一些有趣的东西。

在这里回答的人也可以在 SO 上交叉发布并在那里回答。

代码设置:

declare @t1 TABLE (ID varchar(max),Action varchar(max), DateTime datetime );
INSERT INTO @t1
Select *
from
(
VALUES 
('w2337','Open','2020-11-06 12:28:10.000'),
('w2337','Hold','2021-06-14 14:50:59.000'),
('w2337','Open','2021-06-14 14:51:26.000'),
('w2337','Hold','2021-06-15 14:50:59.000'),
('w2337','Open','2021-06-17 14:51:26.000'),
('w2337','Open','2021-06-18 14:51:26.000')

) t (ID, Action, DateTime);

with cte1 as (
select [ID],[Action],[DateTime]
,ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) as [RegIndex]
,DENSE_RANK () OVER (ORDER BY ID) as [Index by ID]
,ROW_NUMBER() OVER (PARTITION BY ID …
Run Code Online (Sandbox Code Playgroud)

sql-server cte

8
推荐指数
2
解决办法
999
查看次数

检查另一个会话的 IMPLICIT_TRANSACTIONS 设置

在 SQL Server 中,您可以IMPLICIT_TRANSACTIONS通过@@OPTIONS.

如何找到IMPLICIT_TRANSACTIONS另一个会话的值?

这绝对可以做到,因为 SQL Server Profiler 显示了这一点。

sql-server metadata

8
推荐指数
1
解决办法
112
查看次数