标签: sql-server

sp_send_mail 的数据库权限问题

我正在尝试发送数据库邮件,但我收到EXECUTE permission denied on the object 'sp_send_dbmail' database 'msdb', schema 'dbo'.. 我正在运行的代码如下:

SELECT SUSER_NAME(), USER_NAME();
Create USER kyle_temp FOR LOGIN Foo
EXECUTE AS USER = 'kyle_temp';
SELECT SUSER_NAME(), USER_NAME();
EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Mail Profile',
            @recipients = 'test@test.com',
            @subject = 'Test',
              @body = 'Test'
REVERT;
DROP USER kyle_temp
Run Code Online (Sandbox Code Playgroud)

Foo Login 显示它映射到 msdb 中的 Foo 用户。当我查看 msdb 中的 foo 用户时,我看到它已检查“DatabaseMailUserRole”并在 dbo 上执行sp_send_dbmail

我错过了什么?

sql-server sql-server-2008-r2 database-mail

9
推荐指数
1
解决办法
4988
查看次数

为什么 SQL Server 中的填充因子默认为 0 (100%)?

我了解填充因子、页面和索引结构,因此我理解为什么 100% 填充因子是一种罕见的最佳实践。那么为什么它默认为 0 (或 100% )呢?为什么不是 90 或 95?

有什么我想念的吗?

index sql-server best-practices fill-factor

9
推荐指数
1
解决办法
1339
查看次数

将事务日志文件放在单独的驱动器上是否有性能优势?

有许多博客文章和最佳实践文章颂扬将 SQL Server 数据文件放在一个硬盘驱动器上并将事务日志放在另一个硬盘驱动器上的优点。给出的原因是数据库文件将经历随机读取和写入,而事务日志将只有顺序写入。

但是,如果您有数百个数据库呢?将数百个事务日志文件放在一个单独的磁盘上是否有真正的性能优势?如果要写入多个事务日志,那么我认为事务日志写入与数据库写入一样随机。

sql-server transaction-log hardware

9
推荐指数
1
解决办法
1543
查看次数

sp_executesql 的安全隐患是什么?

默认情况下,在SQL Server中,[public]角色拥有EXECUTE权利sp_executesql

不过,我继承,其中前面的DBA已撤销的数据库服务器EXECUTE上的权利sp_executesql

作为临时解决方法,我一直在根据需要授予EXECUTE权限sp_executesql(通过 master 数据库中的角色)。但这开始成为维护之痛。

如果我EXECUTE重新授予公众,是否有任何我需要注意的影响?

security sql-server permissions

9
推荐指数
1
解决办法
2789
查看次数

在任何 RESTORE DATABASE 事件后自动执行存储过程

是否可以让SQL Server 2008 R2 Standard在任何已还原附加到实例的给定数据库中自动执行存储过程?

我已经通过创建服务器级触发器接近解决方案,该触发器在 DDL 事件CREATE_DATABASE或被ALTER_DATABASE触发后执行给定数据库中的存储过程。不幸的是,这不适用于数据备份恢复。

详细地说,我们有一个“清理”存储过程,它存在于我们恢复的每个数据库中,我正在寻找一种方法,每当备份恢复到实例时自动执行此过程。

谷歌搜索指出我可以在 SQL Server 中配置审计策略来获得此功能,但这些功能乍一看非常令人难以抗拒,所以我不知道审计或策略是否是开始调查的途径。

sql-server sql-server-2008-r2

9
推荐指数
2
解决办法
7855
查看次数

在备份大型 SQL Server 数据库时执行数据更新操作

我有一个大型(数千万条记录)数据库,我将在其上执行完整的数据库备份

但是,数据库足够大,事务可以在备份发生之前和期间启动,也可以在备份发生期间和之后提交。

例如:

T0 = Transaction A start
T1 = Full database backup start
T2 = Transaction B start (will not deadlock with A)
T3 = Transaction A commit/rollback (does not matter, does it?)
T4 = Full database backup end
T5 = Transaction B commit/rollback (again, does not matter, does it?)

T0          T1          T2          T3          T4          T6
||----------||----------||----------||----------||----------||---------->
Run Code Online (Sandbox Code Playgroud)

我的理解是在备份期间不使用锁(尽管由于高 I/O 可能会出现其他性能问题),但我不确定我能保证什么会被提交。

此外,我担心的不是数据库将处于不一致状态,而是该状态将是什么(即使它不是确定性的,如果有一组可以一致应用的规则)以及它是如何到达那里的(例如,有多少数据文件与事务日志一起用于创建备份文件)?

sql-server-2008 sql-server backup sql-server-2008-r2

9
推荐指数
1
解决办法
4249
查看次数

识别所需索引的工具

我想为我的数据库中的每个表创建最好的索引。SQL Server 中是否有查询或工具可以帮助完成此过程?

index sql-server-2008 database-design sql-server sql-server-2008-r2

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

什么时候应该删除和重新创建索引?

我们正在构建一个最初为 1 TB 的数据仓库,并将每月增长约 20gigs。

对于某些表,我们每天都在执行 ETL 过程,而对于其他表,我们每周/每月执行一次。

当有数据导入到表中时,是否需要删除并重新创建索引?

是否有必要删除和重新创建索引,或者它们是否会自动更新?

统计信息设置为自动更新。

非常感谢您的帮助和指导。

我得到了这个天才脚本:

SELECT 'ALTER INDEX [' + ix.name + '] ON [' + s.name + '].[' + t.name + '] ' +
       CASE WHEN ps.avg_fragmentation_in_percent > 40 THEN 'REBUILD' ELSE 'REORGANIZE' END +
       CASE WHEN pc.partition_count > 1 THEN ' PARTITION = ' + cast(ps.partition_number as nvarchar(max)) ELSE '' END
FROM   sys.indexes AS ix INNER JOIN sys.tables t
           ON t.object_id = ix.object_id
       INNER JOIN sys.schemas s
           ON t.schema_id = …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 data-warehouse sql-server

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

什么会导致孤立的##MS_PolicyEventProcessingLogin##?

今天早上我注意到我的 SQL 日志充满了以下消息:

在队列 'msdb.dbo.syspolicy_event_queue' 上运行的激活过程 '[dbo].[sp_syspolicy_events_reader]' 输出以下内容:
'无法作为数据库主体执行,因为主体“##MS_PolicyEventProcessingLogin##”不存在,这种类型的主体不能被冒充,或者您没有权限。

运行以下EXEC sp_change_users_login 'report'显示登录实际上已被孤立。

我能够按照此 MSDN 帖子中的建议运行以下命令来修复它。

EXEC sp_change_users_login 
    'Auto_Fix', '##MS_PolicyEventProcessingLogin##', 
    NULL, 'fakepassword'
Run Code Online (Sandbox Code Playgroud)

但问题仍然存在:究竟是什么原因导致这位校长成为孤儿?谷歌搜索和研究表明其他人也有这个问题,但我还没有找到原因的描述。在错误开始出现的那一刻,我没有注意到任何值得注意的事情。

去年夏天,我们将整个服务器迁移到 SAN 存储模型,在迁移期间我们恢复了所有内容(包括 msdb),但那是几个月前的事情。只是最近的事情才使症状明显,因为它没有出现在几周前的日志中。

sql-server-2008 sql-server logins

9
推荐指数
1
解决办法
9794
查看次数

SQL Server 如何为外键引用选择索引键?

我正在使用从 MS Access 导入的旧数据库。在 MS Access > SQL Server 升级过程中创建了大约 20 个带有非集群唯一主键的表。

其中许多表还具有唯一的非聚集索引,它们是主键的副本。

我正在尝试清理它。

但是我发现在我将主键重新创建为聚集索引,然后尝试重建外键后,外键引用了旧的重复索引(这是唯一的)。

我知道这一点,因为它不会让我删除重复的索引。

我认为 SQL Server 会始终选择一个主键,如果存在的话。SQL Server 是否有在唯一索引和主键之间进行选择的方法?

要复制问题(在 SQL Server 2008 R2 上):

IF EXISTS (SELECT * FROM sys.tables WHERE name = 'Child') DROP TABLE Child
GO
IF EXISTS (SELECT * FROM sys.tables WHERE name = 'Parent') DROP TABLE Parent
GO

-- Create the parent table
CREATE TABLE Parent (ParentID INT NOT NULL IDENTITY(1,1)) 

-- Make the parent table a heap
ALTER TABLE Parent ADD …
Run Code Online (Sandbox Code Playgroud)

index sql-server primary-key sql-server-2008-r2

9
推荐指数
1
解决办法
2712
查看次数