小编Aar*_*and的帖子

在 SQL Server 中重新启用 Windows 身份验证

我的老员工在我们的服务器中禁用了 Windows 身份验证。现在,即使我对服务器具有管理员访问权限,也无法访问 SQL Server。我需要重置sa密码。

我尝试使用 Remus 描述的单用户模式登录,但出现以下错误:

用户“SERVER\Administrator”登录失败。
原因:账户被禁用。
(Microsoft SQL Server,错误:18470)

sql-server-2008 authentication sql-server

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

存储完整/部分表的历史记录

我正在使用 Django 和 MySQL (InnoDB) 构建一个 Web 应用程序,目前正在考虑如何管理各种表上的历史更改。

我想知道在那些没有改变的行上存储大量带有 NULLS 的行是否有效。例如,这是我的产品表的简单表示;

在此处输入图片说明

products_history表的所​​有字段(FK和非逻辑行除外)都设置为NULL,而普通products表的NOT NULL所有字段都设置为,除了description

现在我想到的是推送实际产品行的副本并将更改推送到products_history表中。所以假设我有这一行products

{600, CURRENT_TIMESTAMP, 2, 'BS001', NULL, 49.95}
Run Code Online (Sandbox Code Playgroud)

并将价格更改为48.50。所以我会推送哪些值发生了变化,在这种情况下base_price,将更改行添加到历史表中;

{600, THE_date_created_FROM_PRODUCT, NULL, NULL, 49.95}
{600, CURRENT_TIMESTAMP, NULL, NULL, 48.50}
Run Code Online (Sandbox Code Playgroud)

因此,在第一次修改产品时,它将获得 2 行,之后每次修改只有一个新的修改字段)。之后它将product使用新的base_price.

这种方法对我有用并且非常有效(因为只有第一次实际编辑产品时,历史表才会填充产品数据),但我想知道通过存储所有这些 NULL 值是否有效。一段时间后它会影响我的表现还是影响不会那么大?

除此以外; 我很好奇在 MySQL 中这样做的好方法,甚至是 Django ORM 特定的方法。

mysql innodb

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

具有多列的索引是否会使类似的索引变得多余?

假设我有一个看起来像这样的表:

CREATE TABLE Activity (
    ActivityID int primary key identity(1,1) ,
    ActivityName nvarchar(10),
    InactiveFlag bit
)
Run Code Online (Sandbox Code Playgroud)

具有如下所示的索引:

CREATE INDEX Activity_Index on Activity 
( 
    ActivityName
)
Run Code Online (Sandbox Code Playgroud)

然后出于某种原因,有人创建了第二个索引:

CREATE INDEX Another_Activity_Index on Activity 
( 
    ActivityName, InactiveFlag
)
Run Code Online (Sandbox Code Playgroud)

删除第一个索引绝对安全吗?它只是占用了不必要的磁盘空间吗?第二个索引会覆盖第一个索引的所有情况吗?列排序绝对是“ActivityName”第一。

index sql-server index-tuning

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

我可以优化这个 MERGE 语句吗?

我正在尝试在两个表之间进行单列合并。第一个表 ( VisitorSession) 有 40,000,000 行。第二个 ( ShoppingCart) 有 9,000,000 行。

在我的开发环境中,查询只需不到 8 分钟。但是在生产环境中,它应该占用更少(更强大的机器)。但是,我预计该查询至少需要 2 分钟才能在生产中运行。我知道这个查询会导致开发环境中的其他开发人员超时,这意味着它很容易导致客户超时。是否有更安全和/或更快的方法来执行此查询?

declare @dt datetime = cast(dateadd(month, -6, getdate()) as date);

merge ShoppingCart as TargetTable  -- 07:55 to complete in Dev
using 
(
  select * from -- 04:55 to run select, resulting in 12,727,927 rows in Dev
  (
    select
      visitorid  -- int, not null, foreign key
      ,useripaddress  -- varchar(55), null
      ,row_number() over 
      (partition by visitorid order by createdate desc) as [row]
    from VisitorSession (nolock) …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization merge

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

如何使分区或文件组停止服务

我是一位经验丰富的 SQL Server DBA,但不熟悉分区,我有几个问题。使用 SQL Server 2008 R2 企业版。

我继承了一个每天增长约 10 GB 的大型客户指标数据库。该数据库目前由一个文件组 (PRIMARY) 中的一个大数据文件组成。所有表都有一个名为 的日期时间列InsertedDate。我想对数据进行水平分区InsertedDate,每个日历周使用一个单独的数据文件。

在测试环境中,我将所需的附加文件组和数据文件添加到该数据库中,InsertedDate在每个表中放置了聚集索引,并设置了分区功能和分区方案。通过查询sys.partitions和其他系统表,我确认数据现在物理上驻留在正确的分区和数据文件中。

其中,目标是:

  • 通过仅备份PRIMARY当前日期范围内的文件组和文件组来减少备份时间(我目前正在运行每晚完整备份)。一旦日期范围过去,该分区将永远不会被再次写入,因此我想将文件组设置为只读并最后一次备份它。

  • 能够最终使分区“停止服务”。3 个月后,不再需要将旧数据保持在线,因此我想将这些数据离线(但如果需要,可以再次将这些数据重新在线)。

问题:

1) 如何在不备份整个数据库的情况下对这个分区数据库执行备份?我可以备份单个文件组,但要恢复它需要数据库的其余部分,这违背了使用多个较小数据文件的目的。

2) 如何使分区停止服务?我读过关于切换的内容,但似乎只有当您想在同一数据库内的分区之间移动数据时才有效。我希望能够简单而安全地将一系列数据脱机(并在必要时将其重新联机)。

sql-server sql-server-2008-r2 partitioning

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

使用设计功能查看时查看已损坏

总而言之,我上周五发生了一件非常奇怪的事情。我们有一个每天更新的表,它使用一个作业来触发一个利用视图的过程。列正在从视图转换到正在更新的表,即视图中的列 A 正在更新表中的列 D,而不是它应该具有的列 A。

当我右键单击视图并从菜单中选择“设计”时,我可以看到问题确实是生成的 sql 语句正在写入以使用视图中 A 列的信息更新表中的 D 列。

我怀疑视图定义发生了变化,所以我右键单击视图并编写脚本以查看它上次更新的时间,当我这样做时,生成的脚本是正确的,并且与我选择“设计”选项时生成的 sql 完全不同. 在这一点上,我删除了视图并从脚本中重新创建了它。现在一切都很好。

有没有人见过这个?自 2000 年以来,我一直在使用 SQL 服务器,但从未遇到过这种情况。我们在 Win2K3 上使用 SQL2005 SP4(即将升级到 12)。任何见解将不胜感激。-保罗

sql-server ssms view

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

为什么删除不会增加表中未使用的空间?

如果我填充下表:

IF OBJECT_ID ('dbo.CleanTableTest', 'U') IS NOT NULL
    DROP TABLE dbo.CleanTableTest;
GO
CREATE TABLE dbo.CleanTableTest
    (FileName nvarchar(4000), 
    DocumentSummary nvarchar(max),
    Document varbinary(max)
    );
GO
-- Populate the table with data from the Production.Document table.
INSERT INTO dbo.CleanTableTest
    SELECT REPLICATE(FileName, 1000), 
           DocumentSummary, 
           Document
    FROM Production.Document;
GO

exec sp_spaceused CleanTableTest
go
Run Code Online (Sandbox Code Playgroud)

结果:

name           rows  reserved  data    index_size  unused
-------------- ----  --------- ------- ----------- ------
CleanTableTest 13    456 KB    440 KB  8 KB        8 KB
Run Code Online (Sandbox Code Playgroud)

但是如果我删除所有行:

delete dbo.CleanTableTest
go

exec sp_spaceused CleanTableTest
go
Run Code Online (Sandbox Code Playgroud)

结果: …

sql-server delete tablespaces

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

将 CHAR 转换为 DATETIME 以便我可以使用 DATEADD()

我有一个关于将DATEADD()函数用于标识为的列的问题CHAR (6)

time_stamp列包含类似131329as 的值hhmmss。每当我尝试创建一个新列来保存列的值time_stamp+ 5 分钟时,我都会收到错误消息。

消息 242,级别 16,状态 3,第 1 行
字符数据类型到日期时间数据类型的转换导致日期时间值超出范围。`

我想要做的是创建一个新列,它比time_stamp. 我现在正在处理一份显示“已完成订单”的报告,但我需要该报告将订单显示为“未完成”至少 5 分钟,然后才能在报告中显示为“已完成”。

sql-server t-sql type-conversion datetime

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

Glenn Berry 查询中的疑问(每个数据库的 CPU)

请,如果这里不是发布此类问题的地方,请告诉我,我将删除它。

在 Glenn berry 的诊断查询中,有一个查询来显示数据库使用了多少 CPU。这是查询:

-- Get CPU utilization by database (Query 24) (CPU Usage by Database)
WITH DB_CPU_Stats
AS
(SELECT DatabaseID,
        DB_Name(DatabaseID) AS [Database Name],
        SUM(total_worker_time) AS [CPU_Time_Ms]
 FROM sys.dm_exec_query_stats AS qs
 CROSS APPLY (SELECT CONVERT(int, value) AS [DatabaseID] 
              FROM sys.dm_exec_plan_attributes(qs.plan_handle)
             WHERE attribute = N'dbid'
              ) AS F_DB
 GROUP BY DatabaseID)
SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [CPU Rank],
       [Database Name], [CPU_Time_Ms] AS [CPU Time (ms)], 
       CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms]) OVER() * 100.0 AS …
Run Code Online (Sandbox Code Playgroud)

performance sql-server-2008-r2 dmv

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

VM 克隆后无法更改服务器名称

由于我无法控制的原因,我必须找到解决此问题的方法。简单地重新安装实例并不是一个选择。在 sys.servers 中显示为 server_id 0 的服务器名称仍显示旧的服务器名称。

运行以下命令时出现错误:

sp_dropserver 'OLD_INSTANCE'
GO
sp_addserver 'NEW_INSTANCE', Local
GO 
Run Code Online (Sandbox Code Playgroud)

错误信息:

消息 15190,级别 16,状态 1,过程 sp_dropserver,第 67 行
服务器“OLD_INSTANCE”仍有远程登录或链接登录。
消息 15028,级别 16,状态 1,过程 sp_addserver,第 87 行
服务器“NEW_INSTANCE”已存在。

最奇怪的是,远程登录是“空”登录。

exec sp_dropremotelogin @remoteserver = 'OLD_INSTANCE'
go
Run Code Online (Sandbox Code Playgroud)

错误信息:

消息 15185,级别 16,状态 1,过程 sp_dropremotelogin,第 70 行
没有从远程服务器“OLD_INSTANCE”映射到本地用户“(null)”的远程用户“(null)”。

旧实例不存在登录信息。

sp_helpremotelogin 'OLD_INSTANCE'
Run Code Online (Sandbox Code Playgroud)

消息 15201,级别 16,状态 1,过程 sp_helpremotelogin,第 37
行 远程服务器“OLD_INSTANCE”没有远程登录。

如果无法删除不存在的登录名,如何重命名该实例?有没有办法刷新登录信息?

sql-server instance sql-server-2008-r2

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