我为 .ndf 创建了太多辅助数据文件 (.ndf) tempdb
。要删除多余的文件,我需要清空文件(内容将移动到其他文件):
DBCC SHRINKFILE('tempdbfile8', EMPTYFILE);
Run Code Online (Sandbox Code Playgroud)
然后删除文件:
ALTER DATABASE tempdb REMOVE FILE tempdbfile8;
Run Code Online (Sandbox Code Playgroud)
但是EMPTYFILE
命令返回错误:
DBCC SHRINKFILE: Page 8:41920 could not be moved because it is a work table page.
Msg 2555, Level 16, State 1, Line 2
Cannot move all contents of file "tempdbfile8" to other places to complete the emptyfile operation.
Run Code Online (Sandbox Code Playgroud)
不用担心,我只需要找到使用此页面的对象即可:
DBCC TRACEON (3604)
DBCC PAGE(2,8,41920) --dbid=2, fileid=8, pageid=41920
Run Code Online (Sandbox Code Playgroud)
该命令返回了很多信息,其中的object_id。但:
Metadata: ObjectId = 0
Run Code Online (Sandbox Code Playgroud)
我不知道该怎么办。什么猫阻止了这个页面被移动?如何定位该对象、进程、会话或其他任何内容?任何帮助将不胜感激,但请注意保持原样或删除其他文件不是解决此问题的有效方法;)。
编辑:
我正在删除这些文件,因为我们曾经遵循“最佳实践”,即为每个处理器内核创建一个文件(相同的初始大小,相同的增长率)。但据我所知,在遇到争用问题之前,没有必要在同一设备上创建额外的 tempdb 文件。在我们的例子中,这是有道理的,因为我们打开了MPIO,并且存储设备可以处理 4 个路径。但是有一个错误,我们最终得到了 …
这可能与 DBA 相关或与开发人员相关,老实说我不知道。
我有两个数据库服务器:
A: SQL Server 2005 (Trigger that uses DBMail on Server B)
B: SQL Server 2008 R2 (DBMail configured)
Run Code Online (Sandbox Code Playgroud)
我在服务器 A 中有一个表,其中电子邮件通知排队,我创建了一个“插入后”触发器来sp_send_dbmail
使用服务器 B执行,就像这样......
A: SQL Server 2005 (Trigger that uses DBMail on Server B)
B: SQL Server 2008 R2 (DBMail configured)
Run Code Online (Sandbox Code Playgroud)
这就是我需要帮助的奇怪之处,请注意,这似乎是一个记录非常差(或严重缺乏)的功能。
现在我可以使用一些示例数据执行最后一条语句,一切正常。但是当我尝试像这样插入表格时......
USE SampleDB
ALTER TRIGGER [dbo].[mail_inserted]
ON [dbo].[tblEmailQueue]
AFTER INSERT
AS
BEGIN
declare @MailTo nvarchar(max), @MailSubject nvarchar(max), @MailBody nvarchar(max)
-- Initialize vars
select @MailTo=MailTo from inserted
select @MailSubject=MailSubject from inserted
select @MailBody=MailBody from …
Run Code Online (Sandbox Code Playgroud) trigger sql-server linked-server msdtc distributed-transactions
据我所知,我有一个独特的问题。我想知道是否有一种方法可以构造一个查询,其中实际 where 子句本身的存在是有条件的。
我正在编写一个存储过程,我想在其中传递一个过滤器(例如Col1=1 or Col2=3
),并且我的查询如下所示:
set @filter = 'Col1=1 or Col2=3' --assume these variables have been declared already
select * from @tbl where @filter --I need to use a table variable
Run Code Online (Sandbox Code Playgroud)
注意:我尝试使用sp_executesql
andsp_sqlexec
但都不采用表变量。我还想避免使用if-else
声明。请不要建议其中任何一个作为您的答案。:)
到目前为止,我已经花了大约 30 个小时努力sp_send_dbmail
去上班。我终于得到了一些工作,但我严重怀疑它的安全性。我想知道一种更好但快速且易于设置的方法(此时我的时间受到严重限制),以及“理想”(最佳实践)解决方案。
当前 SQL Server 2005 配置
- `After Insert` Trigger on table executes `sp_send_dbmail`
- Database Mail SMTP Account setup (with successful mail test)
- Database Mail Profile setup (with "Public Profile" ticked)
- "guest" account added to "DatabaseMailUserRole"
Run Code Online (Sandbox Code Playgroud)
我发现这篇文章提出了“正确”的解决方案,我阅读了这篇文章,在那里我发现这是一个非常复杂的解决方案,似乎有太多可能出错的事情,更不用说难以维护了。
我对替代解决方案的想法是这些。
1. Setup an Application Role in msdb (this would be my first time using one
and not even sure if it IS a solution :P), and use it to ensure that …
Run Code Online (Sandbox Code Playgroud) 我目前有一个 SQL Server 托管两个生产实例,其中有许多 Web 应用程序可以访问它们。据我所知,这些应用程序都没有在其连接字符串中使用特定端口,我也不知道这是否重要。
我的问题是,将这些实例分配给静态端口有什么含义?这会破坏我的应用程序吗?在执行此操作之前,我还需要进行或考虑其他调整吗?
问的原因?我的基础架构团队要求我分配静态端口,以便为受限委派权限分配 SPN。谢谢。;)