标签: sql-server-2008

为什么建议人们不要通过视图更新

在大学期间,我们一直在想不要通过视图更新表,当我进入工作场所时,我们又被告知不要通过视图更新数据库。

在哪里/是否对执行此操作有显着的性能影响?或者这更像是高级开发人员/DBA 告诉初级人员不要这样做的情况,因为他们可能会无意中因不正确的连接而造成严重破坏。

编辑
我使用的是 MSSQL 2000-2008(取决于客户的具体情况)

sql-server-2008 view

8
推荐指数
1
解决办法
4217
查看次数

如果某些数据少于 4000 个字符,nvarchar(max) 如何在数据库中存储数据会很快吗?

我必须开发一个 CMS,它将支持两种语言英语,阿拉伯语。这个 CMS 将是一种文章发布站点。在设计和分析时,我发现有些文章的长度超过 8000 个字符。我的表有一些列

PageID int,
PageTitleEnglish nvarchar(200),
PageTitleArabic nvarchar(200),
PageDescEnglish nvarchar(500),
PageDescArabic nvarchar(500),
PageBodyEnglish nvarchar(max)
PageBodyArabic nvarchar(max)
Run Code Online (Sandbox Code Playgroud)

如果我将 PageBody 保留为nvarchar(4000),那么我限制为 4000 个字符,如果我必须存储阿拉伯语版本,那么我需要 16000 个字节(因为阿拉伯语是 Unicode,比 ASCII 多 3 倍的空间)。

所以我只剩下将PageBody定义为 nVarchar(max) 的选项,从性能的角度来看,这将是不利的。我的实际问题是,如果 PageBody 列中的某些数据少于 4000 个字符,MS SQL Store 会比内联列中的数据或单独在数据库中的数据存储。

我也在谷歌上寻找过这个,但没有找到任何相关的答案以及在这种情况下我如何提高性能。

欢迎对这种多语言 CMS 设计的最佳实践提出任何建议。

我只需要支持两种语言阿拉伯语和英语

sql-server-2008 c#

8
推荐指数
2
解决办法
3229
查看次数

何时向#temp 表添加索引?

在 SSMS 中测试存储过程时,有时会说#someTempTable____________________000000000000005B] (someField)etc上缺少索引

当我像这样将它们添加到 sp 时:

CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[#someTable] ([someField])
GO
Run Code Online (Sandbox Code Playgroud)

我似乎从未看到速度提高。所以,我经常不添加这样的索引。我应该什么时候添加这样的索引?

index sql-server-2008 ssms

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

执行访问另一个 SQL 实例的存储过程

如果这个问题重复了另一个已经问过的问题,我深表歉意。我已经搜索了几个小时,但没有找到适合我的情况。

期望的结果

使用 SQL 身份验证的用户对 Server1(默认实例)上的 Database1 具有执行权限,仅此而已。用户执行一个存储过程,作为其进程的一部分,访问 Server1\Instance2 上的数据库 2。我希望它既安全又简单(两者都很重要)。

更多信息

我的 Windows 凭据可以访问两个实例(位于同一台服务器上)。因此,我可以毫无困难地在我的登录名下执行存储过程。但是,我不想给用户我的访问级别。我还需要使用 SQL 登录,因为用户不在域中。

我想要的是为存储过程提供我对该过程的访问级别。由于我是系统管理员,这将为用户提供该过程所需的一切。如果我让它工作,我可能会为此目的创建一个帐户而不是使用我的帐户,但无论哪种方式都是安全的,因为我控制了存储过程的作用。

我尝试将“WITH EXECUTE AS”语句放在我的存储过程中,但无法获取我的 Windows 登录信息。当我把它放进去时,我会在编译存储过程时得到以下错误:

无法以用户 'domain\jdoe' 身份执行,因为它不存在或您没有权限。

用户在两台服务器上都是系统管理员,就像我说的那样,所以我不确定它还需要什么。

我研究了以下内容:

  • 可信 - 我宁愿不公开我的数据库,这看起来很可怕
  • 链接服务器 - 我不想给予额外的权限。我不相信其他数据库可以访问我的数据库,也不相信我的数据库可以访问所有其他数据库。
  • 证书 - 这看起来复杂而困难。除非我能找到一种非常简单的方法来做到这一点并维护它,否则我不确定是否值得麻烦。
  • 所有权链接 - 再次,可怕。当我的目标是防止安全问题时,这看起来会导致更多的安全问题。
  • 镜像用户 - 我什至在另一个服务器实例上创建了相同的(显然不同的 SID)用户并给它相同的密码。不行。

我觉得我错过了一些明显的东西,但我不确定它是什么。因为我整天都在用头撞墙,所以我可能离得太近了,看不到它。如果这里有人能帮我一把或指出我正确的方向,我将不胜感激。我会说我已经阅读了很多 MSDN 文章(我讨厌他们 - 他们似乎从来没有告诉我我想知道什么)。我真正想要的是一个简单、易于遵循的教程,它会引导我了解如何做到这一点。除此之外,即使是我需要走的方向的一般指示也会有所帮助。

sql-server-2008 sql-server

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

如何绕过我的 SQL Server 约束?

我们在我们的数据库中发现了一些违反活动约束的行。这怎么可能?

约束处于活动状态,因为我们不能手动添加绕过此约束的行。但是,当我们运行 时CHECKCONSTRAINTS(Files),我们发现它在我们的测试运行期间有几次被绕过了。有问题的行都是在半秒内创建的,表明存在某种竞争条件。

这是应用于表的约束。该规则旨在确保给定父文件夹中的名称唯一性:

ALTER TABLE Files ADD CONSTRAINT UniqueNameInParentFolder CHECK
    CheckUniqueNameInFolder(ParentFoldersID, Name) = 1;
Run Code Online (Sandbox Code Playgroud)

此约束调用如下所示的函数:

-- first check for the new name in the Folders table
IF ((SELECT COUNT(*) FROM Folders 
     WHERE ParentFoldersID = @FoldersID AND Name = @Name) = 0)
BEGIN 
    -- then check for it in the Files table
    IF ((SELECT COUNT(*) FROM Files 
         WHERE ParentFoldersID = @FoldersID AND Name = @Name) <= 1)
        RETURN 1
END
RETURN 0
Run Code Online (Sandbox Code Playgroud)

在事务中添加了单独的行,所以我很难理解重复的行是如何绕过这个限制的。

sql-server-2008 sql-server

8
推荐指数
3
解决办法
2583
查看次数

库存数据库的单独归档表或软删除

我正在构建一个跟踪计算机设备和其他硬件设备的库存数据库。在任何设备生命周期的某个时刻,它都会退役并被归档。归档后,需要对其进行跟踪,因为它已从服务中移除并妥善处置。我最初使用活动数据库的精确副本设计了归档机制,该副本将使用从活动数据库中删除时的触发器接收其数据。存档数据库包括所有相关表的副本,因为由于某些外来相关记录不再相关,因此用户不应访问它们以用于新设备,但需要使用存档表进行引用完整性和查询。请记住,此处存档的概念不仅仅是保存历史记录或日志。归档是业务流程的一部分,

下面的 ERD 使用该Inventory.DeviceType表作为示例,其中所有条目和更新都复制到该Archive.DeviceType表中。当用户不再能够输入某种设备类型的库存记录时,它会从Inventory.DeviceType表中删除,但保留在存档表中。此模式用于所有表以确保存档引用有效数据,因此是所有表的副本。

活动表示例(省略其他相关表) 主动ERD

归档表示例(省略其他相关表) 存档 ERD

问题

我想弄清楚如果我不知道设备是活动的还是存档的,我将如何查询数据库?例如,如果用户有一个序列号并想查找有关设备的信息,而他们不知道它是否已存档。

选项 1:基于联合创建一个视图?

选项 2:如果第一个查询没有返回任何内容,则查询活动数据库,然后查询存档?

传奇还在继续……

一位同事建议我删除存档数据库并使用软删除方案。我使用这个想法构建了一个模型,然后开始遇到许多其他问题。

以下是使用软删除方案的相同表。

软删除示例

软删除 ERD

使用此设置,通过将IsArchivedfield设置为 true 并输入ArchivedDate. 我可以轻松查询任何设备是否处于活动状态或已存档。(请忽略该IsActive字段,因为它用于不相关的概念)。

请注意电话子类型表,我必须在其中传播 DeviceID 和 IsArchived 标志的索引,因为活动设备的电话号码必须是唯一的。我也必须对其他子类型表执行此操作。我不知道这是一个好还是坏的设计。

这部分真的让我很困惑......

在外键值可以标记为已删除的情况下,处理软删除的最佳做法是什么。我唯一能想到的就是创建一个例程来搜索与已删除数据相关的所有记录,并为用户创建一个报告来解决差异。例如,如果位置表与设备表相关,并且某些位置被软删除,则设备指的是不再存在且必须移动的位置。

顺便说一下,我使用的是 MS SQL Server 2008 R2,我计划在我的应用程序中使用 Entity Framework 4。我更看重数据库的可维护性而不是性能。

感谢您的阅读。

sql-server-2008 normalization database-design sql-server

8
推荐指数
1
解决办法
6625
查看次数

关闭所有 SQL Server 数据库的自动收缩。为什么这不起作用?

我想我可以使用 sp_MSforeachdb 来解决这个问题,但我收到一条错误消息。

sp_MSforeachdb '
BEGIN
USE [?]
DECLARE @dbid INT
SET @dbid = DB_ID()
IF(@dbid > 4)
BEGIN
    --PRINT ''[?]'' + CONVERT(VARCHAR, @dbid)
    --ALTER DATABASE [?] SET AUTO_SHRINK OFF
END
END;
'
Run Code Online (Sandbox Code Playgroud)

如果我在未注释 PRINT 行的情况下运行上述查询,我​​将获得除系统数据库之外的所有数据库的列表。但是,当我取消注释 ALTER DATABASE 行时,我收到以下两条错误消息:

消息 5058,级别 16,状态 2,第 9 行
无法在数据库“master”中设置选项“AUTO_SHRINK”。
消息 5058,级别 16,状态 1,第 9 行
无法在数据库“tempdb”中设置选项“AUTO_SHRINK”。

这似乎在某些时候中断了操作,因此只有一些数据库被禁用自动收缩。

知道如何在所有数据库上禁用自动收缩吗?额外问题:为什么我的方法不起作用?

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

8
推荐指数
1
解决办法
7350
查看次数

与 OUTPUT 合并似乎没有做正确的事情

我正在向表中添加外键,并删除任何违反 FK 的行,将它们复制到 ModifiedTable_invalid 表中。作为脚本的一部分,我有以下 MERGE 命令:

MERGE ModifiedTable t1
USING TargetTable tt
ON t1.JoinColumn = tt.JoinColumn
WHEN MATCHED THEN
    UPDATE SET t1.FkColumn = tt.FkSource
WHEN NOT MATCHED BY SOURCE THEN DELETE
OUTPUT DELETED.* INTO ModifiedTable_invalid;
Run Code Online (Sandbox Code Playgroud)

但是,此命令似乎将 ModifiedTable 中的每一行插入到 ModifiedTable_invalid 中,而不仅仅是那些被 MERGE 命令删除的行。这是怎么回事,我如何让它只将已删除的行放在 ModifiedTable_invalid 中?

sql-server-2008 sql-server merge

8
推荐指数
1
解决办法
3782
查看次数

增加 SQL Server 表中分区数的最佳方法

我正在维护一个带有大表的数据库,每个月分配。那里已经有几十个分区,但它直到 2013 年 1 月,所以是时候创建新的分区了。

任何人都可以请建议,创建新分区数量的最佳方法是什么。

我正在执行以下步骤(尚未执行)

  1. 从 SSMS,获取数据库的属性并移动到文件选项卡。
  2. 单击右下角的添加按钮以添加新行。
  3. 输入新文件名(例如 FN_DW_Archieve_2013_02)
  4. 放置一个新的逻辑名称(例如 LN_DW_Archieve_2013_02)
  5. 通过在文件组单元格下的下拉列表中选择来创建一个新的文件组。(例如 FG_DW_Archieve_2013_02)
  6. 点击确定

这将在我的数据库中创建一个新文件组。

现在最让我担心的问题是修改分区功能和分区方案。哪位专家建议,我可以删除并重新创建它们,它是否会影响我现有的数据。或者我可以使用其中的新分区更改它们。

提前致谢。

sql-server-2008 sql-server partitioning

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

索引碎片和SSD盘

我是性能问题的新手,但我看到一些讨论,SSD磁盘解决了由索引碎片引起的性能问题。有没有人经历过这个?我正在考虑更换我的硬件,如果这有帮助,我正在徘徊

performance sql-server-2008

8
推荐指数
1
解决办法
1631
查看次数