Questions tagged «sql-server»

所有版本的Microsoft SQL Server(非MySQL)。还请添加特定于版本的标记,例如sql-server-2016,因为它通常与问题相关。

5
安装SQL Server RAID 10与RAID 5
我是设置SQL Server和Vms的新手。我的前任将Raid 5用于SQL安装所在的C驱动器,并将RAID 10用于数据库文件和数据库日志。 我想知道这是否正确,还是应该将RAID 5用于SQL数据库文件? 有什么帮助吗?

2
SQL Server插入后触发器
我希望married在对marital_status列上的文本进行插入后触发该触发器,这是我到目前为止的结果 ALTER TRIGGER [dbo].[marriage] ON [dbo].[applicant_personal_info] AFTER INSERT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; IF (SELECT [marital_status] FROM inserted) = 'married' BEGIN INSERT INTO [dbo].[applicant_marriage_info]([dom]) VALUES('abc') END END

3
链接服务器风险
我正在实现一项新功能,该功能需要来自多台服务器上数据库的数据。我只需要合并所有这些服务器中的数据并对其进行排序。我想到的两个选择是: 使用链接的服务器并编写一个简单的查询,以对将在一台服务器上运行的数据进行合并和排序,并从另一台服务器收集数据。 使用应用程序从所有服务器收集数据,然后将其发送回SQL Server进行排序(不想在应用程序中实现排序)。 我们在SQL Server 2008 r2的活动/活动群集中运行服务器。所有数据库都具有相同的权限,如果您有权访问一个数据库/服务器,则对它们全部都具有权限。这是一个面向公众的应用程序(需要用户登录)。 使用链接服务器有哪些风险?我应该关注任何安全漏洞吗?在主动/主动群集中运行链接服务器是否有任何问题?与替代方案相比,会不会有任何重大的性能问题? 关于链接服务器,似乎普遍存在负面的“嗡嗡声”,但是我找不到任何具体的东西可以使我相信那里确实存在任何问题。

2
日志传送-使用STANDBY进行还原-在SQL Server 2012上不断崩溃
我们RESTORE WITH STANDBY在SQL Server 2012上使用日志传送,以便以只读模式还原数据库以进行报告。但是,完成一个或两个日志备份的还原后,日志传送设置不断中断。日志传送仅在以方式运行时才会中断RESTORE WITH STANDBY;RESTORE WITH NORECOVERY不会造成任何问题。 我唯一的直觉是主数据库不是那么动态。因此,当没有事务时,这可能导致RESTORE流程出现问题? 有什么想法,已知的解决方法吗? 我通过运行一个常规工作对几天进行了几天工作,该工作在两个表上进行了大量更新。当作业停止运行时,日志传送设置迅速失败,无法处理.trn文件。我重置了日志传送,并尝试通过进行一次小的更新来查看它是否能够继续运行,无论它仍然失败了,更改表中一条记录的一列的值。 感谢您的所有回复。 PS:摘录自我们的日志 2013年2月25日13:00:00,LSRestore_DBDB01-A_BulldogDB,进行中,1,DBREPORTS,LSRestore_DBDB01-A_BulldogDB,日志传送还原日志作业步骤。,2013-02-25 13:00:12.31 ***错误:无法将日志备份文件'\\ dbsan01 \ DBBackups \ LSBackup_BulldogDB \ BulldogDB_20130225180000.trn'应用于辅助数据库'BulldogDB'。(Microsoft.SqlServer.Management.LogShipping)*** 2013-02-25 13:00:12.31 ***错误:处理数据库'BulldogDB'的日志时发生错误。如果可能,请从备份还原。如果没有备份,则可能需要重建日志。 恢复期间发生错误,阻止数据库'BulldogDB'(8:0)重新启动。诊断恢复错误并进行修复,或从已知的良好备份中恢复。如果错误没有得到纠正或无法预期,请联系技术支持。 RESTORE LOG异常终止。 已处理文件1上数据库'BulldogDB'文件'BulldogDB'的0页。 为文件1(.Net SqlClient数据提供程序)上的数据库'BulldogDB'文件'BulldogDB_log'处理了1页 2013-02-25 13:00:12.32 ***错误:无法记录历史记录/错误消息。(Microsoft.SqlServer.Management.LogShipping)*** 2013-02-25 13:00:12.32 ***错误:ExecuteNonQuery需要打开且可用的连接。连接的当前状态为关闭。(System.Data)*** 2013-02-25 13:00:12.32跳过辅助数据库'BulldogDB'的日志备份文件'\\ dbsan01 \ DBBackups \ LSBackup_BulldogDB \ BulldogDB_20130225180000.trn',因为无法验证该文件。 2013-02-25 13:00:12.32 …

4
差距和孤岛:客户端解决方案与T-SQL查询
用于间隙和孤岛的T-SQL解决方案能否比在客户端上运行的C#解决方案运行得更快? 具体来说,让我们提供一些测试数据: CREATE TABLE dbo.Numbers ( n INT NOT NULL PRIMARY KEY ) ; GO INSERT INTO dbo.Numbers ( n ) VALUES ( 1 ) ; GO DECLARE @i INT ; SET @i = 0 ; WHILE @i < 21 BEGIN INSERT INTO dbo.Numbers ( n ) SELECT n + …

1
表达式中的类型转换可能会影响查询计划选择中的“ CardinalityEstimate”吗?
我维护一个存档数据库,该数据库将历史数据存储在分区视图中。分区列是日期时间。该视图下的每个表都存储一个月的数据。 我们使用datetime列上的检查约束来约束每个表上的事件。这使优化器可以限制在搜索表中查找在事件datetime列上进行过滤的查询。 检查约束的名称由SQL Server生成,因此很难通过查看其名称来知道它们的作用。 我希望约束名称的格式为“ CK_TableName_Partition”。 我可以使用此查询并从sql_text列复制数据来生成重命名脚本。WHERE子句匹配检查约束,其名称看起来像是由SQL Server生成的: SELECT checks.name AS check_name, tabs.name AS table_name, skemas.name AS schema_name, cols.name AS column_name, N' EXECUTE sys.sp_rename @objname = N''' + skemas.name + N'.' + checks.name + N''', @newname = N''CK_' + tabs.name + N'_Partition'', @objtype = ''OBJECT'';' AS sql_text FROM sys.check_constraints AS …

1
SSIS 2008程序包配置被忽略
与2008年相比,与2005年(当我在命令行上指定/ ConfigFile something.dtsConfig)相比,程序包配置发生了变化,程序包中定义的变量将保留其设计时值,而不是使用config文件中的设置。 我不太确定我是否了解如何获取要使用的外部配置文件。我读过的文章说只有设置的设计时配置会覆盖外部文件的负载。这是否意味着我可以将变量更改为空白字符串,然后将其覆盖?我无法完全删除变量!整数呢? 我看过一些文章提到使用软件包中的软件包配置关闭。 我可以使用SSIS包编辑器或XML编辑器来更改包中的配置文件路径,然后它将使用该文件的设置“ last”(无论使用外部/ ConfigFile选项如何),但是我不想成为更换包装。我想要一个带有Test.dtsConfig和Production.dtsConfig的程序包,并且能够在不更改程序包的情况下来回交换。 现在推荐的方法是什么?

1
对于同一行中的多个选择,是否有比“联合全部”更好的选项?
示例架构: CREATE TABLE [dbo].[Base]( [ID] [int] IDENTITY(1,1) NOT NULL, [Option1ID] [int] NULL, [Option2ID] [int] NULL, [Option3ID] [int] NULL, [Option1Name] [varchar] NULL, [Option2Name] [varchar] NULL, [Option3Name] [varchar] NULL, [Option1LName] [varchar] NULL, [Option2LName] [varchar] NULL, [Option3LName] [varchar] NULL,) 有没有办法获得显示如下的结果: ID | OptionID | OptionName | OptionLName 我试图使用UNION ALL来实现这一点,但是这意味着在我的示例中要在同一行上执行3次,但在我真正的问题中,我必须执行10次。由于遗留代码,我无法规范化表。有没有办法只遍历基本行一次?

2
在单个文件组上分区
我的数据库中有一些非常大的表,但是这些数据的很大一部分是“旧的”。 由于无法控制的情况,我不允许删除此“旧”数据。另一个限制是我无法修改数据库,这意味着要向其中添加文件组。按照目前的状态,所有内容都驻留在PRIMARY文件组中。 我正在考虑将这些表划分为几个分区,例如“新”,“旧”,“已归档”等。为此,我确实有一个“状态”列。 考虑到上述情况和限制,我想知道分区在这里是否有意义。换句话说,如果以这种方式对我的表进行分区,但是所有分区都位于同一文件组上,SQL Server将足够聪明地在我的“新”数据所驻留的基础文件中找到该特殊区域,并且不会碰到具有“旧”数据的区域? 换句话说,如果我的数据中有80%是“旧的”。SQL Server是否具有避免访问100%的基础文件并仅访问20%的包含“新”数据的机制(假设,当然,我WHERE在查询的子句中指定了分区列)。 我想回答这个问题,就需要了解如何在内部实现分区。我感谢任何指示。

2
镜像数据库上的事务日志维护
SQL Server版本:2008 R2 Enterprise SP2 我试图解决我们的SQL Server维护问题,遇到了一些我认为不正确的问题。我们有一个生产实例,其中有3个数据库都异地镜像到DR实例。 在查看DR实例时,我注意到LDF文件非常庞大,对于频繁使用的数据库,该文件超过35GB。 我知道这可能是由于镜像数据库处于完全恢复模式,并且从未备份过日志,它们只会继续增长直到驱动器空间用尽。 我们正在主体数据库上进行日志备份,而我的问题是在镜像上进行日志备份的陷阱是什么? 在进行日志备份之前,至少必须完成一次从镜像的完整数据库备份,在这种情况下,由于镜像是镜像,是否需要使用特殊选项? 同样,这是MIRROR数据库上的事务日志维护建议。 感谢您的输入

1
更新统计信息时抽样工作如何?
我有几个大桌子。我想通过每周维护计划来确保其统计信息是最新的。 但是,这样做会花费太多时间。 如果我指定 WITH SAMPLE 50 PERCENT 然后SQL Server进行采样: 页面的前50% 每隔一页 或其他策略? BOL对此尚不清楚。

3
是否可以通过还原MASTER数据库来恢复TDE证书?
(幸运的是,我们目前还没有处于这种情况下,只是提前计划,看看如果发生的话我们的选择将会是什么。) 对于使用透明日期加密(TDE)加密的数据库,除非您拥有用于对其进行加密的证书的备份,否则无法恢复该数据库备份的副本。 如果您没有那个怎么办?还有其他选择吗? 如果服务器整体出现故障,在新硬件上还原MASTER数据库的备份是否还会还原证书?

1
处理使用insert-exec块调用的存储过程中的异常
我有一个在insert-exec块中调用的存储过程: insert into @t exec('test') 如何处理存储过程中生成的异常并仍继续处理? 以下代码说明了该问题。我想做的是根据内部exec()调用的成功或失败返回0或-1 : alter procedure test -- or create as begin try declare @retval int; -- This code assumes that PrintMax exists already so this generates an error exec('create procedure PrintMax as begin print ''hello world'' end;') set @retval = 0; select @retval; return(@retval); end …


2
用过滤的(非空值)索引替换索引有什么作用?
我们的项目运行着非常大,非常复杂的数据库。因此,大约一个月前,我们注意到包含空值的索引列使用的空间变得太大。为此,我编写了一个脚本,该脚本将动态搜索包含大于1%的空值的所有单列索引,然后在值不为空的情况下删除并重新创建这些索引作为筛选索引。这将在整个数据库中删除并重新创建数百个索引,通常会释放整个数据库使用的近15%的空间。 现在我对此有两个问题: A)以这种方式使用过滤索引的不利之处是什么?我认为这只会提高性能,但是会涉及性能风险吗? B)在删除和重新创建索引时,我们收到错误消息(“无法删除索引XYZ,因为它不存在或您没有权限”),即使事后检查,一切都按预期进行。怎么会这样 谢谢你的帮助! 编辑:响应@Thomas Kejser 嗨,谢谢,但事实证明这是一场灾难。当时我们还不了解几件事,例如: 在查询期间,SQLOS在确定不能使用NULL值联接表列之前先制定索引计划。IE,您确实确实需要有WHERE子句过滤器,以适合查询中使用的每个过滤索引的索引,否则该索引将根本不使用。 删除和创建索引,然后再次冗余更新其统计信息可能仍然不足以产生更新的计划,而我们认为是可以的。在某些情况下,似乎只有足够高的工作量会迫使SQL Server重新评估计划。 执行计划程序的功能有些奇特之处,仅凭常识和逻辑很难确定。甚至在成千上万的由代码背后生成的不同查询的变体中,看似无用的索引也可以帮助进行某些统计和查询计划,最终将其用于关键查询中。 最后,这些更改被还原。因此,过滤后的索引是一个强大的工具,但是您需要真正了解从这些列中获取的数据。除了空间问题以外的常规索引都非常容易应用,而过滤后的索引则代表了非常定制的解决方案。它们当然不能代替常规索引,而是在需要它们的特殊情况下对其的扩展。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.