标签: sql-server

如何将意外修改错误数据库的风险降至最低?

我刚刚了解到,在对象资源管理器中断开与服务器的连接并不会阻止您执行已经在该服务器上打开的查询窗口。

我的情况是这样的:我有一个 SSMS 实例,用于连接到我们的开发/登台服务器和我们的生产服务器。我不得不在 dev 上删除一堆数据,所以我想我应该关闭与生产的连接,但我没有注意我正在使用的查询窗口。(幸运的是,我们只有几个小时前的备份。)

我不是第一个破坏生产数据的人,也不会是最后一个,我敢肯定。因此,我正在寻找可帮助您将在错误数据库上执行查询的风险降至最低的清单、最佳实践等。您以前是否遇到过这种情况,您是如何调整工作流程以尽量避免这种情况的?

sql-server ssms

12
推荐指数
4
解决办法
3169
查看次数

IDENTITY_INSERT 如何影响并发?

我正在尝试使用 3rd 方 SAP 附加组件帮助客户,该附加组件有发布故障并且已停止支持。

在某些情况下,它会将发帖队列表中未完成的帖子归档到发帖存档表。我需要将这些存档的结果移回队列中。

队列 ID 是一个身份列,我想保持不变。

问题是,如果我执行 identity_insert on/insert/identity_insert off,对于创建队列条目并期望自动生成标识列的进程的并发性,我可以期待什么?

任何有关演示此类行为的最佳方式的指针也将不胜感激。

sql-server-2005 sql-server insert identity

12
推荐指数
1
解决办法
3078
查看次数

在 SQL 中比较两个大型数据集的有效方法

目前,我正在比较两个包含独特StoreKey/ProductKey组合的数据集。

第一个数据集具有StoreKey/ProductKey2012 年 1 月开始到 2014 年 5 月结束之间的唯一销售组合(结果 = 450K 行)。第二个数据集具有独特的StoreKey/ProductKey组合,销售从 2014 年 6 月开始,直到今天(结果 = 190K 行)。

我正在寻找StoreKey/ProductKey属于第 2 组但不在第 1 组的组合 - 即从 6 月初开始销售的新产品。

到目前为止,我已将两个数据集转储到临时表中,为两个表的两个键创建索引,并使用该EXCEPT语句查找唯一项。

比较如此大的数据集的最有效方法是什么?有没有更有效的方法来进行这种大型比较?

performance sql-server sql-server-2008-r2 except query-performance

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

Transact-SQL 中的对称差分运算?

我一直都知道UNIONSQL 中的运算符,但直到最近才发现还有其他的集合运算符,INTERSECTEXCEPT. 我一直无法找到执行第四大集合运算符的运算符,即对称差异(例如 . 的相反INTERSECT

看起来我可以通过使用类似的东西来获得所需的输出

SELECT Field FROM A UNION SELECT Field FROM B 
EXCEPT
SELECT Field FROM A INTERSECT SELECT Field FROM B
Run Code Online (Sandbox Code Playgroud)

(假设我得到了正确的优先级),或者通过做一个反完全连接:

SELECT A.Field, B.Field
FROM A
FULL JOIN B ON B.Id = A.Id
WHERE B.Id IS NULL OR A.Id IS NULL
Run Code Online (Sandbox Code Playgroud)

但是这两个看起来都像是相当密集的查询,尤其是与其他三个基本的集合操作相比。SQL中是否存在对称差异操作而我在文档中找不到它?或者是否有一种“规范”的方式在 T-SQL 中实现它?

sql-server t-sql

12
推荐指数
1
解决办法
3858
查看次数

编写维护计划脚本

我使用 SQL Server Management Studio (SSMS) 为我的 SQL Server 2008 R2 创建了维护计划。

但是,我无法将其导出/转换为脚本,以防我需要在另一台服务器上重做。

有办法吗?

如果没有,是否有更新版本的 SQL Server 的方法?

sql-server sql-server-2008-r2 maintenance-plans

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

CHECKPOINT 或 COMMIT 写入磁盘?

假设,对于 SQLServer2008R2 及更高版本,具有完整恢复模式数据库。

我一直认为:

  1. 当一个事务被提交 (COMMIT) 时,该事务被写入 RAM 中的事务日志。

  2. 当 CHECKPOINT 发生时(在一段时间和/或一些事务和其他条件之后),最后一个 CHECKPOINT 和当前事务之间的事务被写入磁盘。

  3. 当 BACKUP LOG 发生时,数据将写入 MDF 文件。

我对么?我的一些同事说我错了,即使有 BOL 也很难找到正确的答案。

谢谢!

sql-server

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

Switching Data In Fails with“允许目标表上的检查约束或分区函数不允许的值”

鉴于以下

-- table ddl
create table dbo.f_word(
    sentence_id int NULL,
    sentence_word_id int NULL,
    word_id int NULL,
    lemma_id int NULL,
    source_id int NULL,
    part_of_speech_id int NULL,
    person_id int NULL,
    gender_id int NULL,
    number_id int NULL,
    tense_id int NULL,
    voice_id int NULL,
    mood_id int NULL,
    case_id int NULL,
    degree_id int NULL,
    citation nvarchar(100) NULL
);
-- create partition function
create partition function pf_f_word_source_id (int)
as range left for values 
(
    1,2,3,4,5,6,7,8,9,10,11,12,13,14,
    15,16,17,18,19,20,21,22,23
);

-- create the partition scheme
create partition scheme ps_f_word …
Run Code Online (Sandbox Code Playgroud)

sql-server partitioning sql-server-2014

12
推荐指数
1
解决办法
4724
查看次数

高效传输大量(8400 万行)数据

我有大约 8400 万行。其中所有这些都需要转移到同一服务器上的单独数据库中,然后我删除以从源数据库中删除大约 6000 万行。

8400 万行都在同一个表中。仅该表就占了整个数据库的 90%。

所以... 来源:8400 万行 -> 2400 万行目标:0 行 -> 8400 万行

源正在运行完全恢复模式,目标将运行简单。

我想知道最有效的方法是什么?

方案一:

1) 插入目标 SELECT * FROM 源

2) 截断来源

3) INSERT INTO source SELECT * FROM destination WHERE keep_condition = 1

方案B:

1) 将源数据库的备份恢复为目标数据库

2) 删除除目标数据库上需要的表之外的所有表

3) 截断来源

4) INSERT INTO source SELECT * FROM destination WHERE keep_condition = 1

计划C:

1) 插入目标 SELECT * FROM 源

2) DELETE source WHERE keep_condition = 0

或者是其他东西?

谢谢

sql-server

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

客户端如何检索 SQL Server 公共 SSL 证书?

用户能否检索 SQL Server 实例的连接证书(类似于某人检索 HTTP 证书的方式)?如果是这样,如何?

语境

如果 SQL Server 客户端请求加密,则在允许加密连接之前必须验证服务器证书。开发服务器通常配置有自签名证书,在默认客户端设置下不会验证。

要使用自签名证书加密连接,请执行以下任一操作:

  • 证书必须添加到本地存储
  • 客户端必须设置 "TrustServerCertificate=true"
  • 客户端不得请求加密,服务器必须设置"ForceEncryption""yes"

后两个选项在每次建立连接时都会受到中间人攻击。第二,有些客户端不保存连接设置,因此必须为每个新连接重新设置。因此,最理想的解决方案是将证书添加到本地存储(最初需要做更多的工作,但之后是最简单和最安全的选择)。对于域中的用户,证书很容易分发,否则需要在每台计算机上手动安装证书。管理员可以通过直接发送或将其作为网络资源提供给每个用户来提供证书,但有时管理员可能因为其他原因太忙或无响应而无法提供证书。

在这种情况下,如果用户可以直接从 SQL 服务器获取证书将会很有用,就像可以使用浏览器或openssl s_client. 这在检索证书时仍然容易受到中间人攻击,但提供的窗口比每次有新连接时信任证书要窄得多。

sql-server ssl

12
推荐指数
1
解决办法
4527
查看次数

有没有办法只对 WHERE 子句中的变量进行一次空检查?

我对一个看起来像这样的大表有一个查询:

declare @myIdParam int = 1

select * 
from myTable
where (@myIdParam is null or myTable.Id = @myIdParam)
Run Code Online (Sandbox Code Playgroud)

where子句中有几个类似这样的条件,也有很多连接,但这是一个总结。

实际上,如果@myIdParam 为空,我们不希望使用此参数限制结果。

我不是数据库专家,但从我的测试来看,似乎对每条记录都进行了 NULL 检查,并且没有以任何方式优化。

如果我删除空检查并假设参数不为空,则查询会立即返回。否则,最多需要十秒钟。

有没有办法优化它,以便在运行时只进行一次检查?

null sql-server

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