标签: sql-server-2014

创建指向自身的链接服务器

我正在尝试servername\instancename使用以下调用在 SQL Server 2014 实例上创建链接服务器:

EXEC master.dbo.sp_addlinkedserver 
    @server = N'servername\instancename',
    @srvproduct=N'SQL Server'
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Msg 15028, Level 16, State 1, Procedure sp_addlinkedserver, Line 82
The server 'servername\instancename' already exists.
Run Code Online (Sandbox Code Playgroud)

这在 SQL Server 2005 中运行良好,并且根据MSDN

链接服务器不必是 SQL Server 的另一个实例,

所以我不确定最近版本中不允许这样做的更改。使用 UI 会生成类似的消息:

不能将本地 SQL Server 创建为链接服务器。

我知道请求是一件奇怪的事情,但它是为了支持一些在 2005 年工作的遗留代码(并且曾经在不同的实例上)。文档指出它应该可以工作,但事实并非如此。有没有办法让它在 2014 年工作,或者我将不得不修改底层代码?

sql-server linked-server sql-server-2014

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

SQL Server 服务帐户 Windows 特权和权限

我的问题是,如果为每个 SQL Server 进程创建一个新的域用户帐户,应该为每个帐户设置什么权限?或者 SQL 配置管理器是否真的处理了这个问题,而我只是遇到了一个无法预料的问题?

我经常不得不设置 Microsoft SQL Server,并想知道是否有人可以提供有关配置服务应作为运行的帐户的建议。IMO 这已经被微软模糊地记录了下来,虽然他们为你指明了正确的方向,但我从来没有找到任何具体的例子。

总结一下我到目前为止所看到的:

对于简单的部署\开发环境,可以使用安装程序使用的虚拟帐户默认值:例如 NT SERVICE\MSSQLSERVER

避免使用该SYSTEM帐户,这是不安全的。

对于生产环境和域环境,建议使用托管服务帐户,或为每个服务创建域用户帐户(而不是管理员)。据称,如果您在安装时使用域帐户,安装程序将为您设置任何所需的权限。

如果将现有安装上的服务帐户从虚拟帐户更改为域帐户,建议使用 SQL Server 配置管理器来设置新的服务帐户。据称,这将为您设置任何所需的权限。

我只是尝试将现有安装中的服务帐户更改为域帐户,但在我授予该帐户之前,它会使我登录失败 log on as service权限,这与 SQL Server 配置管理器将设置任何所需权限的部分相矛盾。(虽然我不确定 GPO 是否会干扰设置此本地安全策略)

Microsoft在此页面上提供了 SQL Server 安装程序授予的权限列表。

但是我不清楚这是否应该为我创建的用户手动执行以运行服务,或者使用 SQL 配置管理器是否应该自动设置这些权限。

SQL Server 2014,域控制器在 Windows Server 2008 R2 上。

sql-server configuration sql-server-2014 service-accounts

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

备份内部结构 - 当备份作业运行时会发生什么 - 在 SQL Server 中的锁定和性能开销方面?

对于 MySQL,我知道数据库是在 SQL 语句中逐表备份的,这会导致锁定,如果在备份时更新列,则最终可能会出现完整性问题。

据我了解,这不适用于 Microsoft SQL Server,但 SQL Server 是如何处理的?是否有一些内部冻结来保持数据库一致?

我还听说备份是单线程的,这意味着它只使用一个核心,假设您备份到单个文件。还假设您有一台多核机器,例如 16 核,或者至少比 1 多得多。

根据我的个人经验,我在备份时从未遇到过问题,既没有锁定也没有开销问题,但我的经验有限。这就是为什么我总是建议在服务器属性中打开备份压缩。

那么当备份作业正在运行时会发生什么?不同版本是否也有显着差异?例如 2008、2012 和 2014(不是许可证)。

sql-server backup sql-server-2012 sql-server-2014

14
推荐指数
3
解决办法
4717
查看次数

如何实现基于集合的算法/UDF

我有一个算法,我需要针对具有 800K 行和 38 列的表中的每一行运行该算法。该算法在 VBA 中实现,并使用来自某些列的值来处理其他列进行大量数学运算。

我目前正在使用 Excel (ADO) 来查询 SQL 并使用带有客户端游标的 VBA 通过循环遍历每一行来应用算法。它可以工作,但需要 7 个小时才能运行。

VBA 代码非常复杂,将其重新编码为 T-SQL 需要做很多工作。

我已经阅读了 CLR 集成和 UDF 作为可能的路由。我还考虑将 VBA 代码放在 SSIS 脚本任务中以更接近数据库,但我确信存在解决此类性能问题的专家方法。

理想情况下,我能够以基于并行集的方式对尽可能多的行(全部?)运行算法。

任何帮助都很大程度上取决于如何在此类问题上获得最佳性能。

- 编辑

感谢您的评论,我使用的是 MS SQL 2014 Enterprise,这里有更多详细信息:

该算法在时间序列数据中找到特征模式。算法中的函数执行多项式平滑、窗口化,并根据输入标准找到感兴趣的区域,返回十几个值和一些布尔结果。

我的问题更多是关于方法论而不是实际算法:如果我想一次在多行上实现并行计算,我的选择是什么。

我看到建议重新编码到 T-SQL 中,这是很多工作但可能的,但是算法开发人员在 VBA 中工作并且经常更改,因此我需要与 T-SQL 版本保持同步并重新验证每个改变。

T-SQL 是实现基于集合的函数的唯一方法吗?

sql-server ssis functions sql-server-2014

14
推荐指数
1
解决办法
521
查看次数

如何重新加载链接服务器?

我使用的是 Microsoft SQL Server 2014 企业版。链接服务器出现问题,需要重新启动服务器或停止MSSQLSERVER服务。当服务器再次运行时,链接的服务器(到 DB2)无法正常工作,并且 SQL Server 显示以下错误:

消息 7302,级别 16,状态 1,第 10 行
无法为链接服务器“Airspe”创建 OLE DB 提供程序“DB2OLEDB”的实例。

只有在多次重启服务器后,链接服务器才会开始工作。

  1. 为什么需要多次重启服务器才能启动链接服务器?
  2. 还有其他解决方案吗?

这是创建链接服务器之一的脚本:

EXEC master.dbo.sp_addlinkedserver 
@server = N'AIRS', 
@srvproduct=N'Microsoft OLE DB Provider for DB2', 
@provider=N'DB2OLEDB', 
@datasrc=N'###.###.###.##',@provstr=N'Provider=DB2OLEDB;
    Data Source=#####;Persist Security Info=True;Password=**********;
    User ID=######;Initial Catalog=######;
    Network Address=###.###.###;Package Collection=AICOLDP;DBMS Platform=DB2/AS400',
@catalog=N'#####'

EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'AIRS',@useself=N'False',@locallogin=NULL,@rmtuser=N'#####',@rmtpassword='########'
EXEC master.dbo.sp_serveroption @server=N'AIRS', @optname=N'collation compatible', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'AIRS', @optname=N'data access', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'AIRS', @optname=N'dist', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'AIRS', @optname=N'pub', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'AIRS', @optname=N'rpc', …
Run Code Online (Sandbox Code Playgroud)

sql-server linked-server sql-server-2014

14
推荐指数
1
解决办法
2887
查看次数

多语句事务中不允许使用 ALTER DATABASE 语句

我已经从这里下载了基于 AdventureWorks 的内存示例,并遵循了随附文档中描述的所有步骤。但是,当我尝试在 SQL Server Management Studio 中运行脚本时,我收到错误消息:

多语句事务中不允许使用 ALTER DATABASE 语句

错误指向第 9 行,即:

IF NOT EXISTS (SELECT * FROM sys.data_spaces WHERE type='FX')
    ALTER DATABASE CURRENT ADD FILEGROUP [AdventureWorks2012_mod] 
    CONTAINS MEMORY_OPTIMIZED_DATA
GO
Run Code Online (Sandbox Code Playgroud)

由于这是(或多或少)微软官方文档,我假设这是我做错的事情,但我无法弄清楚它是什么。

sql-server in-memory-database sql-server-2014

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

我的计算机名称中的连字符导致 T-SQL 错误

我是一名开发人员,而不是一名 DBA(我很担心这是在展示)。我正在尝试在我的家用计算机(名为John-PC)上使用 SQL Server 2014 Express 运行 Report Builder 3.0,但无法运行我的报告。

我无意中创建的用户/登录组合user = John-PClogin = John-PC\John。当我尝试删除条目时:

Drop Login John-PC\John
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

“-”附近的语法不正确。

我认为问题在于我的计算机名称中的连字符。

  1. 有没有办法绕过语法错误?
  2. 是否有另一种更改或删除用户的方法(我尝试删除sys.server_principals但收到一个错误,我无法进行临时更改)。
  3. 我可以以某种方式给 Report Builder 一个新的用户名/登录名吗?
  4. 如果以上都不是,我可以将我的计算机名称更改为John_PC还是会产生许多我无法想象的其他问题?

sql-server t-sql sql-server-2014

13
推荐指数
2
解决办法
3684
查看次数

查询在 SQL Server 2014 中慢 100 倍,行计数假脱机行估计罪魁祸首?

我有一个查询,它在SQL Server 2012中运行800 毫秒,在 SQL Server 2014中运行大约170 秒。我认为我已经将范围缩小到Row Count Spool运营商的基数估计不佳。我已经阅读了一些关于假脱机操作符的内容(例如,这里这里),但我仍然无法理解一些事情:

  • 为什么这个查询需要一个Row Count Spool运算符?我认为正确性没有必要,那么它试图提供什么特定的优化?
  • 为什么 SQL Server 估计到Row Count Spool操作符的连接会删除所有行?
  • 这是 SQL Server 2014 中的错误吗?如果是这样,我将在 Connect 中归档。但我想先有更深入的了解。

注意:我可以将查询重写为 aLEFT JOIN或向表添加索引,以便在 SQL Server 2012 和 SQL Server 2014 中实现可接受的性能。所以这个问题更多地是关于深入理解这个特定的查询和计划,而不是关于如何用不同的方式表达查询。


慢查询

请参阅此 Pastebin以获取完整的测试脚本。这是我正在查看的特定测试查询:

-- Prune any existing customers from the set of potential new customers
-- This query is much slower than …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2014 cardinality-estimates query-performance

13
推荐指数
3
解决办法
4673
查看次数

无法在 SSMS 2014 中打开还原数据库向导

在运行 Windows Server 2012 R2 的开发机器上,我刚刚将 SQL Server 从 2012 升级到 2014。

使用 SQL Server Management Studio 2014,当我右键单击一个数据库并且Tasks -> Restore -> Database...什么也没有发生时。“还原数据库”向导未按预期显示。

事件查看器中没有错误或崩溃。光标甚至不会变成沙漏。

使用 T-SQL 恢复工作正常,如果我回去使用 SSMS 2012,它工作正常。关于如何让向导在 SSMS 2014 中工作的任何想法?

我在两个版本的 SSMS 中连接到相同的 SQL Server 实例,并且我尝试以管理员身份运行 SSMS。

它是服务包 1:

Microsoft SQL Server Management Studio 12.0.4100.1
Microsoft Analysis Services Client Tools 12.0.4100.1
Microsoft Data Access Components (MDAC) 6.3.9600.17415
Microsoft MSXML 3.0 5.0 6.0 
Microsoft Internet Explorer 9.11.9600.18125
Microsoft .NET Framework 4.0.30319.34209
Operating System 6.3.9600
Run Code Online (Sandbox Code Playgroud)

sql-server ssms restore sql-server-2014

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

我的用户属于哪些 AD 组登录?

我不确定我是否为这个问题选择了正确的标题。我真正想要的是,给定一个单独的 Windows AD 用户,我想找出可以访问此服务器中特定数据库的 Windows AD 组(登录名)的列表

当我运行以下查询时

select
    name,
    principal_id,
    type,
    type_desc,
    default_schema_name,
    create_date,
    modify_date,
    owning_principal_id,
    sid,
    is_fixed_role
from sys.database_principals
Run Code Online (Sandbox Code Playgroud)

在我的服务器中

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64) 2011 年 6 月 17 日 00:54:03 版权所有 (c) Windows NT 6.1(内部版本 7601:Service Pack 1)上的 Microsoft Corporation 标准版(64 位)

我得到以下结果(部分列表):

在此处输入图片说明

我需要知道特定登录名的所有权限。此登录名可以通过 AD 组访问我的服务器/数据库。

1) 从上面的列表中,我的登录名属于哪些 AD 组?

在此处输入图片说明

我一直在下面这样做,但我真的很想找出该用户所属的 AD 组(根据上图可以访问该服务器)的列表。

首先,我以相关用户身份执行

    EXECUTE AS LOGIN='mycompany\HThorne'

    DECLARE @User VARCHAR(20)
    SELECT @USER = SUBSTRING(SUSER_SNAME(), 
CHARINDEX('\', SUSER_SNAME()) + 1, LEN(SUSER_SNAME()))
Run Code Online (Sandbox Code Playgroud)

我确保我拥有正确的凭据

    SELECT   @USER …
Run Code Online (Sandbox Code Playgroud)

sql-server permissions sql-server-2008-r2 active-directory sql-server-2014

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