标签: sql-server

链接服务器可供无权限用户使用

我让用户看到了他们不应该看到的链接服务器。

链接服务器被定义为只有我可以访问它,但每个人都可以看到和使用它。

我使用以下步骤创建了新的链接服务器:

  1. 将 SSMS 对象资源管理器连接到 SQL Server 实例
  2. 展开Server Objects,右击Linked Servers和左键单击New Linked Server...
  3. General选项卡中选择SQL ServerServer type和写入服务器的名称
  4. Security上半部分的选项卡下单击Add,选择“sa”为Local Login,输入Remote User名称和Remote Password
  5. Security下部选项卡下(下For a login not defined in the list above, connections will:)选择第一个选项:Not be made
  6. 单击OK并开始测试

现在唯一应该看到链接服务器的人是我(“sa”),但不知何故其他用户可以看到并使用它。

注1:可以使用链接服务器的用户在远程服务器上有权限,他们不会看到他们不应该看到的数据,他们只能在他们不应该看到的时候从链接服务器访问它。

注 2:我是这sysadmin两个实例中唯一的一个。

security sql-server ssms linked-server

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

DBCC SHRINKFILE 适用于 file_id 但不适用于逻辑名称

我正在尝试缩小数据库文件,但遇到了错误。

使用sys.database_files作品中的 file_id ,但使用逻辑文件名会产生错误。

两个语句中的逻辑文件名相同,所以这不是问题。此外,正在连接的数据库是相同的。以下按预期工作:

declare @fileId as int = (select file_id from sys.database_files where name = 'XY')
DBCC SHRINKFILE (@fileId, 0, TRUNCATEONLY)
Run Code Online (Sandbox Code Playgroud)

然而以下...

DBCC SHRINKFILE ('XY' , 0, TRUNCATEONLY)
Run Code Online (Sandbox Code Playgroud)

...将导致错误 8985:

消息 8985,级别 16,状态 1,第 1 行
无法在 sys.database_files 中找到数据库“<我的数据库>”的文件“XY”。该文件要么不存在,要么已被删除。

sql-server-2008 sql-server shrink system-tables

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

切换到简单恢复时的事务日志维护

背景:

我最近继承了 50 多个带有 450 多个数据库的 SQL Server。每晚备份大约为 8TB,不用说,我们使用的磁盘空间比我们想要的要多。所有数据库都设置为完全恢复,并且从未备份事务日志。我已经浏览了所有 SQL Server,并确定了只需要每晚备份的低优先级服务器,并且可以接受一天的数据丢失。

题:

我正在将许多低优先级数据库SIMPLEFULL. 现有的事务日志是否会被截断(在创建检查点时)?一些现有的事务日志是 50-100GB;为了继续前进,确定我应该将它们缩小到什么的最佳方法是什么?我显然不想让它们那么大。或者,随着时间的推移,它们会自行缩小吗(我认为它们不会)?

sql-server backup recovery transaction-log

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

非聚集索引比聚集索引快?

两个表具有相同的结构,每个表中有 19972 行。为了练习索引,我创建了两个具有相同结构的表并创建了

clustered index on persontb(BusinessEntityID)
Run Code Online (Sandbox Code Playgroud)

nonclustered index on Persontb_NC(BusinessEntityId)
Run Code Online (Sandbox Code Playgroud)

和表结构

BusinessEntityID int
FirstName varchar(100)
LastName  varchar(100)                                                                                                                       

 -- Nonclusted key on businessentityid takes 38%
SELECT  BusinessEntityId from Persontb_NC
WHERE businessentityid BETWEEN 400 AND 4000

-- CLustered key businessentityid takes 62%
SELECT BusinessEntityId  from persontb 
WHERE businessentityid BETWEEN 400 AND 4000
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

为什么聚集索引占 62%,非聚集索引占 38%?

index sql-server sql-server-2008-r2

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

估计与实际行差异(实际远小于估计) - 排序

我正在运行一个查询,该查询正在处理 XML 文档中的一些节点。我估计的子树成本以数百万计,似乎这一切都来自 SQL Server 对我通过 XPath 从 xml 列中提取的某些数据执行的排序操作。Sort 操作的估计行数约为 1900 万,而实际行数约为 800。查询本身运行得相当好(1 - 2 秒),但这种差异让我想知道查询性能以及为什么会这样差别这么大?

performance xml sql-server query-performance

9
推荐指数
1
解决办法
2108
查看次数

查找具有相同子行集的父行

假设我有这样的结构:

食谱表

RecipeID
Name
Description
Run Code Online (Sandbox Code Playgroud)

配方成分表

RecipeID
IngredientID
Quantity
UOM
Run Code Online (Sandbox Code Playgroud)

关键RecipeIngredients(RecipeID, IngredientID)

有哪些查找重复食谱的好方法?重复配方被定义为具有完全相同的一组成分和每种成分的数量。

我想过使用FOR XML PATH将成分组合到一个列中。我还没有完全探索这个,但如果我确保成分/UOM/数量按相同的顺序排序并且有一个合适的分隔符,它应该可以工作。有更好的方法吗?

有 48K 食谱和 200K 成分行。

sql-server-2008 database-design sql-server relational-division

9
推荐指数
2
解决办法
3861
查看次数

处理事务复制的身份范围

我注意到当您设置事务复制时,SQL Server 会将标识范围管理设置为手动。这意味着在我的订阅数据库中,当我尝试将一条新记录插入到 PK 是标识列的表中时,它会给我一个错误并说它试图插入一个“1”、“2”的 PK "、"3" 等。这是因为订阅者上所有标识列的当前标识值被重置为种子值(通常为 1),而不是保持在发布者上的值。

我理解 SQL Server 这样做的原因 - 您应该将订阅者表保留为只读。但是,我的场景有点不正统 - 我通过复制不时更新我的​​订阅者,立即备份该数据库,然后我想对订阅者进行一些不会被推回发布者的更新,然后当我再次更新订阅者时,我从较早的备份中恢复其数据库并提取最新更新。因为我想在这些更新之间对订阅者进行更新('临时增量',如果你愿意的话),我需要标识列工作,而不是在复制时重置为 1。

我在设置发布时尝试打开自动标识范围管理,但是当我尝试将表添加到发布时,这只会给我以下错误:

消息 21231,级别 16,状态 1,过程 sp_MSrepl_addarticle,第 2243 行
自动标识范围支持仅对允许更新订阅者的发布有用。

有什么办法可以解决这个问题吗?我确实想将此复制呈现给 SQL Server,就好像它在订阅者端是只读的一样,因为我不打算进行将推送回发布者的更新,但我确实想要进行临时更新将在下一次复制之前被擦除。

我还考虑过快照复制可能是比事务复制更适合我的使用模式的方法,但问题是快照复制需要每次更新都发送整个该死的数据库;因为我打算在最近一次复制后立即备份数据库,所以我不需要每次都进行整个传输;只是自上次以来的变化。

sql-server sql-server-2008-r2

9
推荐指数
1
解决办法
4381
查看次数

默认跟踪已启用但未激活

当我查询默认跟踪的配置时,它显示已启用:

exec sp_configure 'default trace enabled';
-->
name                    minimum  maximum  config_value  run_value
default trace enabled         0        1             1          1
Run Code Online (Sandbox Code Playgroud)

但是当我查询sys.traces路径时,它返回一个空行集:

select * from sys.traces;
Run Code Online (Sandbox Code Playgroud)

什么可以解释没有启用的跟踪?

sql-server sql-server-2008-r2 trace

9
推荐指数
1
解决办法
4298
查看次数

数据库在线时可以复制数据库的文件吗?

我正在 SQL Server 2008 R2 SP1 上设置生产数据库的开发副本。目前,两个开发人员很少使用实时数据库进行只读查询,但新数据库也会对其进行更新。

由于数据库是 2.1TB,总共需要 3 天时间来恢复和更新到我们测试所需的最新版本,我最初的计划是创建一组新的备份文件,然后从这些文件中恢复。这将允许我在同一 SQL 实例和机器上创建数据库的开发副本,而不必使当前数据库脱机。

但是,为了节省这几天的时间,我认为只复制物理数据库文件并附加数据库的新副本可能是个好主意。不幸的是,当我尝试复制时,我收到一个错误,指的是 SQL Server 对这些文件的锁定。

由于除了传输日志文件之外我无法将数据库脱机(我可以在人们早上进入之前完成此操作),有什么方法可以复制实时数据库文件而不将数据库置于脱机状态?还是应该等到人们回家后再做?

sql-server sql-server-2008-r2

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

SqlPackage 不从配置文件中提取变量

我想使用 .dacpac 和 sqlpackage.exe 升级数据库

这是我运行 sqlpackage 的方式:

SqlPackage.exe
    /Action:Publish
    /SourceFile:"my.dacpac"
    /Profile:"myprofile.publish.xml"
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

*目标脚本中未定义以下 SqlCmd 变量:foo.

我已经验证 myprofile.publish.xml 文件确实包含该 var:

<ItemGroup>
  <SqlCmdVariable Include="foo">
    <Value>bc\local</Value>
  </SqlCmdVariable>
Run Code Online (Sandbox Code Playgroud)

我还验证了创建 dacpac 的项目确实使用 Visual Studio 从 Visual Studio 中成功发布 myprofile.publish.xml

我还能缺少什么?

(我使用的是 SQL Server 2012)

sql-server

9
推荐指数
1
解决办法
5558
查看次数