标签: sql-server-2012

如何在容器之间移动或重新分发 FILESTREAM 文件?

我们有一个FILESTREAM包含几百万个文件的容器,我们相信这是我们遇到的性能问题(大量超时)的原因。

根据这个关于FILESTREAM最佳实践的博客,每个容器不应超过 300,000 个文件。

根据此处接受的答案,除非将表重新创建到新FILESTREAM位置,否则无法完成它。

  1. 我的情况是这样吗?
  2. 如果是这样,确保每 300,000 个文件自动创建足够的容器来处理此问题而无需手动干预的推荐方法是什么?

表的结构如下:

CREATE TABLE [dbo].[Documents](
    [ContentPath] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
    [FileContent] [varbinary](max) FILESTREAM  NULL,
 CONSTRAINT [UQ_IX_Documents_ContentPath] UNIQUE NONCLUSTERED 
(
    [ContentPath] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY] FILESTREAM_ON [FSFileGroup_1]
Run Code Online (Sandbox Code Playgroud)

我们使用的是 SQL Server 2012。不幸的是,不是 Enterprise(我们最近才意识到它支持每个文件组多个容器)。

尽管我们从不进行记录更新,但我们进行了大量写入,可能与读取一样多。模式是:一次一个,由 ContentPath 读取,并且没有特定的容器或顺序写入。

sql-server sql-server-2012 filestream

6
推荐指数
1
解决办法
3225
查看次数

将进行源数据库的尾日志备份 ? 为什么我看到这个警告

我从第一台服务器(运行 SQL Server 2014)备份了一个数据库。

当我尝试将备份恢复到第二台服务器(运行 SQL Server 2012)时,我收到以下警告消息:

警告消息 - 将进行源数据库的尾日志备份。查看选项页面上的设置。

如果我忽略此消息并尝试恢复,则会失败。

任何的想法 ?我该怎么办 ?

sql-server restore sql-server-2012 sql-server-2014

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

创建一个函数以生成特定格式的列值

我是数据库的新手,事实上,我是编程的新手。我想创建一个函数或者一个存储过程(如果它有效)来为用户表的一列插入/创建默认值。在这个表中,每个注册用户都应该被分配一个userId like K16060600,格式为Kyymmddxx,其中

  • K对于每个userId都是常数,
  • yy代表年份(例如162016 年),
  • mm 代表月份,
  • dd 代表白天,
  • xx 是一个 00 到 99 的数字,每当添加新行/用户时,它应该从 00 递增。
  • 保证我每天加的不超过100个。

我怎样才能做到这一点?

我使用的是 Visual Studio 2012 和 SQL Server 2012。

sql-server t-sql sql-server-2012

6
推荐指数
1
解决办法
1112
查看次数

SQL Server 复制

我们遇到了复制问题,其中在 3300 万行的表上进行了大型(750 万行)更新。复制将其转换为 750 万条单独的更新语句。当我的警报通知我我们的出版物低于我们的门槛时,我开始检查这个问题。

我发现更新已被执行,并且需要几天时间来仔细阅读这些更新语句。所以我决定看看我们是否可以跳过它试图处理的那些记录。使用系统表和存储过程,我能够确定执行更新的时间段。一旦找到最后一个xact_seqno,我就停止分发代理,并手动更新订阅者数据库。然后我执行sp_setsubscriptionxactseqno, 跳过所有这 750 万笔交易。当我启动分发代理时,它似乎工作正常并且能够处理剩余的事务。

为了更好地衡量,我使用 Redgate 的数据比较来查看数据是否混乱,但我丢失了大约 24 条记录(最初可能没有,因为我没有设置它)。

我的问题是这是修复它的正确方法吗?你怎么总是保证得到下一个Xact_seqno?您是按Xact_Seqnoentry_time 或 entry_time订购交易?

replication sql-server sql-server-2012 transactional-replication

6
推荐指数
1
解决办法
192
查看次数

向“NT AUTHORITY\SYSTEM”授予系统管理员权限

对于 SQL Server 2012 及更高版本,如SQL Server 安装中的新增功能所述:

BUILTIN\administrators本地系统( NT AUTHORITY\SYSTEM ) 不会在 sysadmin 固定服务器角色中自动配置。

就我而言,这已经成为一个问题:我有一个 WiX 安装程序,它使用Custom ActionC++ 代码来设置数据库数据(创建数据库、视图、过程、数据等)。Custom Action以 user 身份运行NT AUTHORITY\SYSTEM,但此帐户没有执行CREATE DATABASE脚本的权限。

  1. 安装软件时赋予sysadmin角色是否正确NT AUTHORITY\SYSTEM?或者也许有更好的解决方案?

  2. 如果正确,是否可以找到正确的用户名NT AUTHORITY\SYSTEM?我需要这个名字才能更改权限*。在不同的语言环境中,此名称是不同的,例如,NT AUTHORITY\SYSTEMNT AUTHORITY\???????


添加NT AUTHORITY\SYSTEMsysadmin角色:

IF NOT EXISTS
(
    SELECT name
    FROM master.sys.server_principals 
    WHERE IS_SRVROLEMEMBER ('sysadmin', name) = 1 
    AND name LIKE 'NT AUTHORITY\SYSTEM'
)
EXEC …
Run Code Online (Sandbox Code Playgroud)

sql-server scripting sql-server-2012

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

SQL Server - 如何授予 SELECT 权限以访问来自不同所有者的架构中的数据?

我需要帮助来处理我的数据库中的权限问题。

这是场景:

1 数据库

4 架构

  • 架构A ; 所有者dbo
  • 架构B;所有者所有者X
  • 架构C ; 所有者所有者X
  • 架构D ; 所有者所有者X

schemaD 中,我有一个名为viewABC的视图,它从在schemaAschemaB e schemaC上分配的表和视图中获取信息。

用户用户X拥有SELECT权限viewABC

使用以下命令我授予权限:

GRANT SELECT ON schemaD.viewABC TO userX;
Run Code Online (Sandbox Code Playgroud)

userX尝试SELECT对视图执行 a时,可以这样:

SELECT * FROM schemaD.viewABC;
Run Code Online (Sandbox Code Playgroud)

我们得到错误:

对象“tableA”、数据库“MyDatabase”、架构“schemaA”的 SELECT 权限被拒绝。

我确实理解发生错误是因为tableA位于不同的架构上,具有不同的所有者(dbo 而不是 ownerX),并且 SQLServer 应用 userX权限来授予或拒绝访问权限。一旦userX 没有对 tableA显式访问权限,查询执行就会返回错误。 …

sql-server sql-server-2012

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

测量长距离 SQL 连接的延迟

我们为连接到其 SQLServer 数据库的客户编写了一个简单的“客户端”应用程序,对“属性”运行大约 360 次查询,并将该数据作为我们称为“cProp”的 .Net 对象返回。

查询的复杂性各不相同,但最长的可能需要 400 毫秒。当我们最近为 60 个属性运行它时,整个运行大约需要 3 分钟。客户决定将他们的数据库移动到我们之间 65 毫秒的远程服务器。结果,相同的查询需要 51 分钟。

现在我 99% 确定问题是行检索,但我需要证明这一点。DBA 对该过程进行了跟踪,但之前从未使用过它,我很沮丧地发现它包含的信息如此之少。我所看到的是,它花了不到 4 分钟的服务器时间。这加强了我的信念,即问题出在行检索上。

但我如何衡量呢?跟踪不返回关于行数或总数据大小的任何信息 - 我做错了吗?我也知道批处理发生在服务器之外,那么我们如何知道那里发生了什么?一般来说,可以这么说,如何调试“服务器外部”发生的问题。

performance sql-server sql-server-2012 query-performance

6
推荐指数
1
解决办法
3639
查看次数

如何判断我在通过 Windows 身份验证登录时使用了哪个 Windows 组登录名

我创建了两个对应于两个 Windows 组的 SQL Server 登录名:

MachineName\MyAppAmdin
MachineName\MyAppUser
Run Code Online (Sandbox Code Playgroud)

然后在数据库中,我创建了两个具有相同名称的用户并将它们映射到登录名。

在 Windows 服务器中,我将我的域帐户添加MyDomain\MyAccountMachineName\MyAppAmdin组中。

现在我可以通过 Windows 身份验证通过MyDomain\MyAccount.

问题是,我想确切地知道我正在使用哪个 Windows 组登录,但我不知道如何。

我试过:

ORIGINAL_LOGIN()
SYSTEM_USER
SUSER_SNAME
SELECT * FROM dm_exec_sessions
Run Code Online (Sandbox Code Playgroud)

以上所有内容都会返回MyDomain\MyAccount,但我需要知道的是我是否通过MachineName\MyAppAmdin.

总结一下,我的问题是:

有没有办法准确判断当前连接使用的是哪个 Windows 组登录(或用户)?

或者有什么方法可以检查是否MyDomain\MyAccount与特定用户或登录名相关联?

我知道我可以使用 C# 或命令来解析域帐户是否属于特定的 Windows 组,但是我们有一些新的 IT 策略,所以我正在考虑使用 TSQL 实现类似结果的方法。

security sql-server t-sql sql-server-2012 logins

6
推荐指数
1
解决办法
2555
查看次数

跨列复制时,SQL Server 缓存是否聚合结果?

假设我们有一个Orders包含列的表order_id, total, discount

然后我们写一个类似于下面的查询

SELECT
    COUNT(order_id) AS num_orders
    , SUM(total) / COUNT(order_id) as avg_total
    , SUM(discount) / COUNT(order_id) AS avg_discount
FROM Orders
Run Code Online (Sandbox Code Playgroud)

COUNT(order_id)Preserved的值是跨列还是重新计算(例如,是否有性能影响)?或者最好先确定计算值并在查询中使用这些值,例如:

DECLARE @order_count AS INT 

SELECT 
    @order_count = COUNT(order_id) 
FROM Orders

SELECT
    @order_count AS num_orders
    , SUM(total) / @order_count as avg_total
    , SUM(discount) / @order_count AS avg_discount
FROM Orders
Run Code Online (Sandbox Code Playgroud)

请注意,在编写此问题时,我注意到由于AVG()支持SQL Server 2008 。但是,我继续了这个问题,并打算更一般地想了解 SQL Server 如何处理跨列的相同聚合,因为我有时会以其他形式遇到这个问题。

sql-server sql-server-2012

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

系统运行状况扩展事件文件如何滚动?

我看到 SQL Server 中的默认系统健康会话事件是 5 MB,每个事件总共有 4 个文件。

我们正在尝试从历史事件中的系统健康状况中获取数据,但对于一些关键的生产服务器,它们只会非常快速地滚动。对有些人来说,他们甚至在那里呆了几个星期

SQL Server 中滚动文件的机制是如何工作的,有没有一种方法可以检查这种情况何时以及如何发生?

编辑@每个答案

  1. 事件未重新启动
  2. 服务器也没有重新启动,它按计划每月发生一次

因此,我认为系统运行状况中可能会捕获很多不需要的事件。我怎样才能在这个系统运行状况中找到它们并过滤掉它们?

另外,我们应该增加文件大小,比如 200 MB 4 文件,还是只保留 10 MB 80 文件等小文件?哪一个更好?

更新@我已经将此标记为答案,但是在检查弹出的另一件事时:

文件未按顺序填写;假设我将 10 个文件增加到每个 10 MB。我们看到几天前的 1-6 个文件似乎都充满了 10 MB,而同一天的文件 7 和 8 是 2 MB,而文件 9 和 10 完全充满了 10 MB。我想这是意料之中的,只是好奇为什么会这样?

sql-server extended-events sql-server-2012 sql-server-2014

6
推荐指数
1
解决办法
771
查看次数