我想破坏一个数据库页面,并恢复相同的页面。
我怎么做?
运行所有这些命令的登录名是sysadminSQL 2012 Developer 实例上服务器角色的成员。它是部署到的数据库的所有者。EXTERNAL ACCESS ASSEMBLY已授予此 DB 中的登录权限。还尝试了以下所有内容作为sa登录无济于事。
alter database test set trustworthy on
go
create assembly [icsharpcode.sharpziplib]
from 'C:\Workspace\111\icsharpcode-SharpZipLib-4f2d664\bin\Release\ICSharpCode.SharpZipLib.dll'
with permission_set = UNSAFE --< This works!
go
create assembly OutOfRowCompression
from 'C:\Workspace\Sandbox\OutOfRowCompression\OutOfRowCompression\bin\Debug\OutOfRowCompression.dll'
with permission_set = UNSAFE --< This fails!
go
Run Code Online (Sandbox Code Playgroud)
最后一个命令失败:
消息 10327,级别 14,状态 1,第 1 行 CREATE ASSEMBLY 为程序集“OutOfRowCompression”失败,因为程序集“OutOfRowCompression”未被授权用于 PERMISSION_SET = UNSAFE。当以下任一情况为真时,程序集被授权:数据库所有者 (DBO) 具有 UNSAFE ASSEMBLY 权限并且数据库具有 TRUSTWORTHY 数据库属性;或者程序集使用证书或非对称密钥签名,该密钥具有具有不安全程序集权限的相应登录名。
收到错误后,我使用新的非对称密钥对程序集进行了签名key1.pfx,并将其添加到主数据库中:
CREATE ASYMMETRIC KEY key1
FROM executable
FILE = 'C:\Workspace\Sandbox\OutOfRowCompression\OutOfRowCompression\bin\Debug\OutOfRowCompression.dll'
Run Code Online (Sandbox Code Playgroud)
验证密钥是否存在: …
在大型和高度碎片化的数据库上过夜运行索引重建脚本时,我们经常遇到停止工作的索引,因为它们似乎从未完成重建。作业暂停,早上我们必须手动取消语句,永远等待回滚,导致停机。我们可以修复这些偶尔手动删除和重新创建的索引。
如果没有什么进展,有没有办法自动使索引重建语句超时,以便脚本可以继续执行下一个重建语句?
我们的脚本是这样的:
ALTER INDEX ALL ON [Table1] REBUILD WITH (FILLFACTOR = 90)
ALTER INDEX ALL ON [Table2] REBUILD WITH (FILLFACTOR = 90)
ALTER INDEX ALL ON [Table3] REBUILD WITH (FILLFACTOR = 90)..
Run Code Online (Sandbox Code Playgroud) 我听到了两种不同的谣言。一个是 SQL Server 2012 SP3 在 2017 年 6 月失去支持。我也听说 SQL Server 2012 SP4 将于 2017 年 6 月发布。SP4 只是谣言吗?或者这是真的?如果为真,SP4 何时失去支持?
在我的办公室,有人更改了用户对生产数据库的权限。所以在那之后我决定写一个 ddl 类型的触发器来审计权限更改。我已经用谷歌搜索了这个,但我找不到合适的解决方案。那么你们可以给我推荐几个链接或任何示例代码吗?
我想捕获谁更改了权限以及何时更改了权限。
提前致谢。
我们有一个相当大的数据库在 SQL Server 2012 上运行。数据文件现在是 2 118 256 MB。几个星期以来,每当我运行 SSMS 报告磁盘使用情况时,它都会在最底部说“MyDatabase 数据库没有数据文件”。
有人见过这个吗?数据库已启动并正在运行。此报告将显示的内容是否有大小限制?
我们有一个 COTS 产品,它创建了一个非常大的事务日志表。它有一个单一的聚集索引,支持声明为键的 IDENTITY 列。昨晚重建了索引,服务器磁盘空间不足,所以我从上午 12:30 开始工作。
现在我想知道 SQL Server 在重建此索引时是否会执行任何操作?没有叶子页面或页面拆分,因为所有插入都进入最后一页。我们从不删除行(无论如何还没有)。
显然服务器试图做某事,但如果它成功了,桌子会有什么不同吗?我认为这只是一个巨大的空操作和浪费时间。显然,如果表也具有非聚集索引,则情况并非如此。实际上,如果这个表确实有额外的索引,它仍然不需要先重建主索引,如果像我们的表一样,它只是添加,对吗?
我的 DBA 说他在数据库级别而不是在表级别管理所有索引。
附加信息
我的假设是重建后磁盘上的页面看起来和以前一样,我们只是在浪费时间进行数据库改组。
我们有一个每 24 小时运行一次的第三方服务器备份工具,它备份所有内容(文件和数据库,为裸机恢复做准备)。经过大量调查,发现该工具使用了非copy_only备份,从而破坏了系统数据库和我们自己的日志链。
(我一直在研究是否应该备份系统数据库,由于他们持有的关于 SQL Server 一般的数据(例如用户、代理作业等),共识通常是肯定的。这不是关于他们的内容,但如果由于我描述的情况而在恢复后丢失会发生什么)。
为了阻止这种犯罪,我禁用了执行数据库备份的工具,所以现在它只执行文件备份(MDF/LDF 文件除外)。然后我安排 SQL 代理每小时运行一次备份,然后将它们发送到我的私有云。
如果服务器完全故障,并且需要裸机备份,我希望在 SQL 开始备份时数据库不会在那里,因为它们没有被工具备份/恢复(尽管我安全地拥有它们备份)。
此时实际发生了什么?SQL Server 是否会重新创建系统数据库,然后我可以将其还原?或者,它是否只是拒绝启动而我会遇到麻烦?
表列中的示例数据,数据类型NVARCHAR(MAX)。此数据由扩展事件跟踪捕获由实体框架生成的数据库调用收集。
exec sp_executesql N'SELECT TOP (2)
[Extent1].[ccusqcode] AS [ccusqcode],
[Extent1].[ccusname] AS [ccusname],
[Extent1].[ccusfirstname] AS [ccusfirstname],
[Extent1].[ccuslastname] AS [ccuslastname],
[Extent1].[dbirthday] AS [dbirthday],
[Extent1].[ccellphone] AS [ccellphone],
[Extent1].[cdriverlicense] AS [cdriverlicense],
[Extent1].[csocsecno] AS [csocsecno],
[Extent1].[dfirstvisit] AS [dfirstvisit],
[Extent1].[dlastvisit] AS [dlastvisit],
[Extent1].[nmtdrxcount] AS [nmtdrxcount],
[Extent1].[lduplabel] AS [lduplabel],
[Extent1].[cemployerid] AS [cemployerid],
[Extent1].[mnotes] AS [mnotes],
[Extent1].[cemployercontact] AS [cemployercontact],
FROM [dbo].[customer] AS [Extent1]
WHERE ([Extent1].[cusid_PK] = @p__linq__0) AND ([Extent1].[pharminfoid_FK] = @p__linq__1)',N'@p__linq__0 bigint,@p__linq__1 bigint',@p__linq__0=NULL,@p__linq__1=1
Run Code Online (Sandbox Code Playgroud)
我想使用LIKE运算符查找所有带有 text 的行FROM [dbo].[customer]。
SELECT *
FROM [dbname].[schemaName].[tableName]
WHERE …Run Code Online (Sandbox Code Playgroud) 我们在处理一些与此类似的查询时遇到问题:
SELECT COUNT('A') FROM [dbo].[OINV] T0
INNER JOIN [dbo].[OCRD] T2 ON T2.[CardCode] = T0.[CardCode]
WHERE T0.[CardCode] = (@P2) OR T2.[FatherCard] = (@P3)
Run Code Online (Sandbox Code Playgroud)
它击中的索引定义为:
NONCLUSTERED INDEX [OCRD_FATHER] ON [dbo].[OCRD]
(
[FatherCard] ASC
) INCLUDE (CardCode)
NONCLUSTERED INDEX [OINV_CUSTOMER] ON [dbo].[OINV]
(
[CardCode] ASC
)
Run Code Online (Sandbox Code Playgroud)
他们目前需要 1-2 秒来运行,并返回 0 的计数(这是我们所期望的)。
我非常惊讶的是,它在进入哈希匹配之前没有过滤非聚集索引 - 它正在提供每一行。这些是供应商软件查询,因此很遗憾我们无法重写它们。
为什么会这样,有没有办法在不重写查询的情况下在进行哈希匹配之前将其更改为过滤?
示例数据设置
CREATE TABLE [dbo].[OCRD]
(
[FatherCard] NVARCHAR(50),
[CardCode] NVARCHAR(50)
);
INSERT INTO [dbo].[OCRD]
SELECT TOP (2076000) NEWID(),
NEWID()
FROM master..spt_values v1,
master..spt_values v2,
master..spt_values v3
CREATE TABLE …Run Code Online (Sandbox Code Playgroud) sql-server ×10
sql-server-2012 ×10
index-tuning ×2
t-sql ×2
compression ×1
corruption ×1
index ×1
restore ×1
sql-clr ×1
ssms ×1