我的老员工在我们的服务器中禁用了 Windows 身份验证。现在,即使我对服务器具有管理员访问权限,也无法访问 SQL Server。我需要重置sa密码。
我尝试使用 Remus 描述的单用户模式登录,但出现以下错误:
用户“SERVER\Administrator”登录失败。
原因:账户被禁用。
(Microsoft SQL Server,错误:18470)
我正在使用 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 特定的方法。
假设我有一个看起来像这样的表:
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”第一。
我正在尝试在两个表之间进行单列合并。第一个表 ( 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 DBA,但不熟悉分区,我有几个问题。使用 SQL Server 2008 R2 企业版。
我继承了一个每天增长约 10 GB 的大型客户指标数据库。该数据库目前由一个文件组 (PRIMARY) 中的一个大数据文件组成。所有表都有一个名为 的日期时间列InsertedDate。我想对数据进行水平分区InsertedDate,每个日历周使用一个单独的数据文件。
在测试环境中,我将所需的附加文件组和数据文件添加到该数据库中,InsertedDate在每个表中放置了聚集索引,并设置了分区功能和分区方案。通过查询sys.partitions和其他系统表,我确认数据现在物理上驻留在正确的分区和数据文件中。
其中,目标是:
通过仅备份PRIMARY当前日期范围内的文件组和文件组来减少备份时间(我目前正在运行每晚完整备份)。一旦日期范围过去,该分区将永远不会被再次写入,因此我想将文件组设置为只读并最后一次备份它。
能够最终使分区“停止服务”。3 个月后,不再需要将旧数据保持在线,因此我想将这些数据离线(但如果需要,可以再次将这些数据重新在线)。
问题:
1) 如何在不备份整个数据库的情况下对这个分区数据库执行备份?我可以备份单个文件组,但要恢复它需要数据库的其余部分,这违背了使用多个较小数据文件的目的。
2) 如何使分区停止服务?我读过关于切换的内容,但似乎只有当您想在同一数据库内的分区之间移动数据时才有效。我希望能够简单而安全地将一系列数据脱机(并在必要时将其重新联机)。
总而言之,我上周五发生了一件非常奇怪的事情。我们有一个每天更新的表,它使用一个作业来触发一个利用视图的过程。列正在从视图转换到正在更新的表,即视图中的列 A 正在更新表中的列 D,而不是它应该具有的列 A。
当我右键单击视图并从菜单中选择“设计”时,我可以看到问题确实是生成的 sql 语句正在写入以使用视图中 A 列的信息更新表中的 D 列。
我怀疑视图定义发生了变化,所以我右键单击视图并编写脚本以查看它上次更新的时间,当我这样做时,生成的脚本是正确的,并且与我选择“设计”选项时生成的 sql 完全不同. 在这一点上,我删除了视图并从脚本中重新创建了它。现在一切都很好。
有没有人见过这个?自 2000 年以来,我一直在使用 SQL 服务器,但从未遇到过这种情况。我们在 Win2K3 上使用 SQL2005 SP4(即将升级到 12)。任何见解将不胜感激。-保罗
如果我填充下表:
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)
结果: …
我有一个关于将DATEADD()函数用于标识为的列的问题CHAR (6)
该time_stamp列包含类似131329as 的值hhmmss。每当我尝试创建一个新列来保存列的值time_stamp+ 5 分钟时,我都会收到错误消息。
消息 242,级别 16,状态 3,第 1 行
字符数据类型到日期时间数据类型的转换导致日期时间值超出范围。`
我想要做的是创建一个新列,它比time_stamp. 我现在正在处理一份显示“已完成订单”的报告,但我需要该报告将订单显示为“未完成”至少 5 分钟,然后才能在报告中显示为“已完成”。
请,如果这里不是发布此类问题的地方,请告诉我,我将删除它。
在 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) 由于我无法控制的原因,我必须找到解决此问题的方法。简单地重新安装实例并不是一个选择。在 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 ×8
datetime ×1
delete ×1
dmv ×1
index ×1
index-tuning ×1
innodb ×1
instance ×1
merge ×1
mysql ×1
optimization ×1
partitioning ×1
performance ×1
ssms ×1
t-sql ×1
tablespaces ×1
view ×1