标签: sql-server-2008

跟踪未关闭的连接

我每隔几天就会在 IIS7 和 SQL 2008 服务器之间收到超时错误。我得到的错误信息是:

System.InvalidOperationException: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
Run Code Online (Sandbox Code Playgroud)

有时这会自行解决,有时我需要手动重新启动 SQL Server。有什么办法可以追踪这个错误的原因。我 90% 确定它在没有我们的 ASP.NET webforms 应用程序的某个地方打开而不是关闭连接,但我无法确定原因。

sql-server-2008 c#

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

SQL Server 使算术中止启用

我正在使用 SQL Server 2008。

在我的存储过程中,我经常需要调用 XML 数据类型、函数(如 split)。

是否可以永久启用数据库的算术中止?我知道它可以使用属性窗口> 选项来完成,但有没有我可以使用的脚本来打开它?

寻找脚本的原因是显而易见的;我有太多的数据库无法手动完成。

我假设set arithabort offset arithabort on仅针对上下文打开 arithabort。

sql-server-2008 sql-server

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

带附件的 sp_send_dbmail

SQL Server 2008,通过 SQL Server 身份验证连接。

我有一个存储过程在DatabaseA其调用sp_send_dbmailmsdb同一个文件附件的电子邮件。该文件在数据库服务器上,而不是在远程文件共享上。

正在使用的SQL Server的帐户没有系统管理员,但的确属于DatabaseMailUserRolemsdb

发送没有附件的电子邮件是可以的,但是当存在附件时,我收到一个错误:

无法模拟客户端连接安全上下文。附加文件需要集成的客户端登录

有一些关于此的文章/帖子,但有些似乎在说相互矛盾的事情。我一直在研究模拟,并且在 中的存储过程中起作用的一件事是DatabaseA执行以下操作:

EXECUTE AS LOGIN = 'sa' -- or any account with sysadmin privileges
EXECUTE msdb..sp_send_dbmail ....
REVERT
Run Code Online (Sandbox Code Playgroud)

我没想到这会起作用,因为我想发送附件,您需要使用 Windows 身份验证。但是它确实有效,但这意味着需要授予权限较低的 SQL Server 帐户来模拟 sa(或其他系统管理员帐户)。

在将 DBA 的噩梦释放到野外之前,做我作为开发人员的尽职调查......

我的问题是:允许通过 SQL Server(非系统管理员)进行身份验证的用户在不打开安全漏洞的情况下从本地数据库服务器磁盘发送电子邮件附件的好/安全方法什么?

更新:

回复:凭据

我创建了一个新的 Windows 登录,通过 SSMS 为该帐户创建凭据,将这些凭据映射到我的有限权限 SQL Server 帐户。我收到错误:

消息 22051,级别 16,状态 1,第 0 行
无法模拟客户端连接安全上下文。
附加文件需要集成的客户端登录

我肯定错过了什么!

sql-server-2008 security

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

SQLAgentReaderRole 和 SQL AD ID 登录案例影响编辑作业的能力

我在无法编辑自己的作业的 SQL 2008 服务器上有 AD ID 用户。他们可以创建它们,但是为了编辑它们,他们必须删除它们然后重新添加它们。这个问题在这里解释:http : //blogs.msdn.com/b/sqlserverfaq/archive/2009/06/08/owner-of-the-job-will-not-be-able-to-modify-edit-在-job-in-sql-server.aspx

我做了进一步的研究并发现在我的特殊情况下这是因为我使用 CREATE LOGIN [domain\user] 语法添加了 AD ID 用户。使用该方法,AD ID 的大小写就是您在括号中指定的内容。

无论如何,是否可以使用正确的 Windows AD ID 案例创建用户,以便我不必弄清楚然后修改每个 AD ID 用户的登录名?

此外,我使用此脚本为特定用户获取正确的大小写:

execute as login = 'usa\johndoe'
SELECT SUSER_SNAME()
revert;
Run Code Online (Sandbox Code Playgroud)

但是当我要求用户运行 SELECT SUSER_SNAME() 并给我结果时,它为我返回所有小写字母,但所有大写字母。正确的是全部大写(好吧,为了让该用户能够编辑作业)。

我不知所措,非常沮丧。

-- 我发现获得正确大小写的最佳(唯一?)方法是使用 SQL 界面添加用户,单击搜索,输入 AD ID,然后单击检查名称。对于上面的示例,它返回所有大写字母,尽管该脚本示例返回所有小写字母。

sql-server-2008 security sql-server ssms

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

SQL Server 2008 更改数据捕获 (CDC) 是否可能在插入时不保留记录?

SQL Server 2008 引入了一项新的数据审计功能。此功能的基本操作如下:

  1. 当对表启用 CDC 时,SQL Server 会创建另一个表(此处称为 cdc 表),其中包含原始表的所有列以及一些额外的元数据列。
  2. 当插入发生时,cdc 表保留了一份记录副本。
  3. 发生更新时,cdc 表保留更改前和更改后的记录。
  4. 当删除发生时,cdc 表保留更改记录之前。
  5. CDC 使用 SQL Server Agent 监视日志文件并将更改写入 cdc 表
  6. cdc 表中每条记录的元数据的典型大小约为 51 字节。

例如。1 次插入和 1 次更新操作后 原始表保留 1 条记录 cdc 表保留 3 条记录(1 次插入,每次更新 2 条记录)

假设图像大小为 300KB,总大小约为 1,200 KB。它会影响磁盘存储和磁盘 IO。

是否可以不为某种操作(即插入)保留 cdc 记录?

是否有任何其他方法可以审计保留较少记录副本的 Image?

sql-server-2008

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

有没有办法查询 SQL Server 2005/2008 的日志文件位置?

我有一种方法可以查询 SQL Server 2005+ 的各种日志文件的文件系统位置。我的意思是文本日志文件,而不是数据库事务日志文件?

例如,我的 SQL 代理、错误日志和维护计划都写入一个名为:

D:\MSSQLData\MSSQL.1\MSSQL\LOG
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我需要找到这个文件夹的名称。

更新:

除了寻找 SQL 书籍之外,我还浏览了下的注册表

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer
Run Code Online (Sandbox Code Playgroud)

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSQLSERVER` 
Run Code Online (Sandbox Code Playgroud)

但没有什么跳出来给我。

我也想要一种“官方”的方式来实现这一点,而不是依赖于未记录的功能。

sql-server-2005 sql-server-2008 sql-server logs

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

升级SQL Server后如何保证数据一致?

我必须将数据库从 SQL Server 7 和 SQL Server 2000 升级到 SQL Server 2008。此外,我必须能够在法庭上证明迁移前的数据与迁移后的数据完全相同。

有任何想法吗?

sql-server-2008 sql-server sql-server-2000

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

SQL Server 2008 索引

添加到表中的最佳索引是什么,以便尽可能快地进行此查询。sd.incidents表大约有2.5M条记录,问题大约8K,变化大约120K。

select
  --bunch of fields
from
    sd.incidents a
    left join sd.problems b on a.pr_number = b.pr_number
    left join sd.problems c on b.pr_number = c.parent_pr_number and c.is_root_cause = 1
    left join sd.changes d on b.caused_by_change_number_clean = d.change_number
where
    a.severity in (1,2,3) and
    (a.pr_number is not null or a.parent_number is null)
Run Code Online (Sandbox Code Playgroud)

index sql-server-2008 sql-server

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

TempDB 数据文件在 SQL 2008 上不能很好地收缩

因此,理想情况下,您希望适当地预先调整 TempDB 数据和日志文件的大小,以便这不是问题,但有时流氓开发人员会在工作时间内在生产服务器上运行疯狂的大型查询,从而导致 TempDB 数据文件爆炸巨大的。

如果 TempDB 确实是驱动器上唯一的东西,那么我可能就这样保留它,但在某些服务器上,我有几个 SQL 实例,它们都共享同一个 TempDB 驱动器。

那么如何在不重启实例的情况下缩小这些 TempDB 数据文件呢?

我通常会尝试:

DBCC SHRINKFILE (name = 'tempdev', size = 5000)
Run Code Online (Sandbox Code Playgroud)

这在 SQL 2000 和 2005 中相当一致地工作(假设实际的 tempdb 活动已经逐渐减少),但在 2008 年似乎经常工作(在我当前的服务器上,它只适用于 4 个数据文件中的 1 个,其他人继续保留大 2-3 倍)。

sql-server-2008 shrink tempdb

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

SQL Server - 没有备份的 DBO

与我之前的问题类似:Prevent Non Copy Only Backups,如何创建一个可以对我的数据库执行所有操作的用户<EXCEPT>进行备份?

我已授予他们除DB_backupOperator和之外的所有角色DB_Owner。问题是用户需要在数据库中创建对象(存储过程、函数、表等等)。

对于这些角色,这是可能的,但是,他们无法使用他们创建的对象。

IE

create proc test as select 1
go
grant exec on test to [OtherUser]
Run Code Online (Sandbox Code Playgroud)

这成功完成

grant exec on test to [TheCurrentUser]
Run Code Online (Sandbox Code Playgroud)

抛出错误

不能授予、拒绝或撤销对 sa、dbo、实体所有者、information_schema、sys 或您自己的权限

另外,如果我只是尝试执行存储过程,我会得到一个

EXECUTE 权限被拒绝

我对想法持开放态度。

谢谢。

sql-server-2008 sql-server

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