我有一个对数据库具有以下权限的 SQL 帐户:

db_executor您看到此帐户所属的角色是由以下脚本创建的:
CREATE ROLE [db_executor] AUTHORIZATION [dbo]
GO
GRANT EXECUTE TO [db_executor]
GO
Run Code Online (Sandbox Code Playgroud)
当我运行一个select,update,insert或delete放在桌子上,它工作正常。当我尝试truncate桌子时,它给了我这个错误信息:
找不到对象“TableName”,因为它不存在或您没有权限。
此帐户缺少什么权限?
我有一个在托管服务帐户下运行的 SQL Server 2012 实例。我已经用一个帐户配置了数据库邮件,并试图发送一封测试电子邮件,但我在服务器的事件日志中收到了一些错误:
数据库引擎实例=MYINSTANCE;邮件PID=2132;错误消息:数据库更新失败。原因:对象“sysmail_logmailevent_sp”、数据库“msdb”、架构“dbo”上的 EXECUTE 权限被拒绝。
数据库引擎实例=MYINSTANCE;邮件PID=2212;异常类型:Microsoft.SqlServer.Management.SqlIMail.Server.Common.BaseException 消息:数据库读取失败。原因:对象“sp_readrequest”、数据库“msdb”、架构“dbo”上的 EXECUTE 权限被拒绝。数据:System.Collections.ListDictionaryInternal TargetSite:Microsoft.SqlServer.Management.SqlIMail.Server.Objects.QueueItem GetQueueItemFromCommand(System.Data.SqlClient.SqlCommand) HelpLink:NULL 来源:DatabaseMailEngine
如果我将运行 SQL Server 进程的帐户设置为系统管理员,则此错误将消失,并且邮件发送成功。但是,我所做的所有研究都表明,赋予此帐户DatabaseMailUserRole在msdb数据库中的角色就足够了。我已经这样做了,但仍然收到相同的错误。
我查看了 BOL,但找不到任何东西。
我需要允许用户在没有任何能力启动其他代理的情况下启动特定的代理作业。为此,我创建了以下过程(简化):
ALTER PROCEDURE [dbo].[RunJob]
@job_name nvarchar(200)
WITH EXECUTE AS 'sysadminaccount'
AS
BEGIN
--SET NOCOUNT ON;
BEGIN TRY
EXEC msdb.dbo.sp_start_job @job_name = @job_name
-- Wait for job to finish
DECLARE @job_history_id AS INT = NULL
DECLARE @job_result AS INT = NULL
WHILE 1=1
BEGIN
SELECT TOP 1 @job_history_id = activity.job_history_id
FROM msdb.dbo.sysjobs jobs
INNER JOIN msdb.dbo.sysjobactivity activity ON activity.job_id = jobs.job_id
WHERE jobs.name = @job_name
ORDER BY activity.start_execution_date DESC
IF @job_history_id IS NULL
BEGIN
WAITFOR DELAY '00:00:01'
CONTINUE
END
ELSE
BREAK …Run Code Online (Sandbox Code Playgroud) 我运行了Brent Ozar 的 sp_blitz 脚本,它抱怨的一件事是我的 SQL Server 代理帐户具有系统管理员权限。我删除了 sysadmin 权限,但是代理无法启动。(见下图)。事件日志中没有什么值得注意的。当我恢复系统管理员权限时,代理可以毫无困难地启动。

我的帐户是托管服务帐户。我使用的其他托管服务帐户(一个用于运行报告服务,另一个用于运行 SQL 服务)都没有 sysadmin 权限。
实际上是否需要 sysadmin 权限?如果没有,此帐户需要的最低权限是多少?
我最近在我的 2012 SQL Server 上安装了 SP1。从那时起,当我从我的电脑而不是从本地服务器本身连接时,SSMS 的行为有点奇怪。
我不再在服务器和代理上看到绿色的“正在运行”图标,并且几个菜单选项变灰(服务器菜单和代理菜单上的启动/停止/重新启动)。

此外,当我尝试访问活动监视器时,出现以下错误:

我发现了以下关于活动监视器的文章。我按照那里的步骤操作(尽管我是 sql 服务器上的本地管理员,应该已经拥有所有这些权限)但无济于事。服务器运行的是 Windows 2008 R2 Datacenter SP1。当我远程桌面到服务器本身并直接使用 SSMS 时,我没有这些问题,当域管理员通过 SSMS 远程连接到服务器时,一切都对他有用。
有任何想法吗?
我有一个 SQL Server 2012 实例,其中一个链接服务器使用 System i Access ODBC 驱动程序指向 IBM Iseries 系统上的 db2 数据库。
我正在尝试启用分布式事务。我相信该提供商确实根据IBM 文档支持它们(除非我误解了该链接)。
我正在运行以下查询:
BEGIN TRANSACTION
UPDATE LINKEDSERVER.LINKEDDATABASE.SCHEMANAME.TABLENAME SET COLUMN = VALUE
SELECT CAST('qwerty' as integer) -- we want an error here so the transaction fails
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
链接服务器“LINKEDSERVER”的 OLE DB 提供程序“MSDASQL”返回消息“[IBM][System i Access ODBC 驱动程序]登记 DTC 阶段失败。2”。消息 7391,级别 16,状态 2,第 2 行 由于链接服务器“LINKEDSERVER”的 OLE DB 提供程序“MSDASQL”无法开始分布式事务,因此无法执行该操作。
我对这个错误所做的所有研究都遇到过想要禁用分布式事务而不是让它们工作的人。我已经在链接服务器属性上将“启用分布式事务的提升”设置为 true。
任何想法如何让这个工作?
编辑:更多信息/更新。当我在 Windows 日志中注意到这一点时,我正准备暂时放弃这个并等待帮助:
当 XA 事务被禁用时,调用者试图注册一个 XA 资源。
我找到了这个链接,它告诉我如何修改 …
sql-server linked-server sql-server-2012 iseries distributed-transactions
我有一个使用以下 T-SQL 创建的表:
CREATE TABLE [dbo].[TableName](
[id] [int] IDENTITY(1,1) NOT NULL
PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
我今天查看了这张表,注意到 id 列正在跳过值:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26、27、1027、1028、1029、1030、1031、1032、1033、1034、1035、2034、2035、3034
我不担心这个或任何事情(我的应用程序不关心主键是什么),我只是想知道可能导致这种情况发生的原因。似乎确实有一种模式,每次“跳跃”发生时跳跃 1000。
我的应用程序使用实体框架插入这些行,如果这有什么不同的话。
sql-server entity-framework auto-increment identity sql-server-2012
我有一个查询,它根据一个timestamp值连接两个表(不要问)。
其中一个表将数据存储在具有Timestamp数据类型的列中。另一个将其存储为varchar.
以前,查询将timestamp列转换varchar为用于连接的 a。据我了解,这不是 sargable,所以我想做相反的事情。(timestamp表要大得多,效率更是一个问题)。
SELECT *
FROM TABLE1
INNER JOIN TABLE2
ON UPPER(master.dbo.fn_sqlvarbasetostr(cast(TimestampColumn as binary(8))))
= VARCHARTIMESTAMPCOLUMN
Run Code Online (Sandbox Code Playgroud)
我试过了:
CONVERT(ROWVERSION, N'0x0000000003306BDD')
Run Code Online (Sandbox Code Playgroud)
没有错误,但表上没有匹配项(当一行肯定存在时)。
CONVERT(ROWVERSION, CAST(N'0x0000000003306BDD' as bigint))
Run Code Online (Sandbox Code Playgroud)
这会导致错误转换nvarchar为bigint.
如何将varchar值转换为 atimestamp而不是相反?
我最近将临时数据库文件移到了一个单独的驱动器上(我有两个数据文件和一个日志文件)。
但是,重新启动服务器后,我的第二个数据文件从 gui 上的文件列表和 sp_helpfile 中都消失了。我设法多次重现此行为:我添加了一个新数据文件,看到它同时出现在 gui 和 sp_helpfile 中,并在重新启动服务器后消失。
我dbcc checkdb对数据库运行过,它没有返回任何错误。SQL 日志或 Windows 应用程序事件日志中都没有信息。
在做了更多研究之后,我运行了以下查询:
select d.name, m.* from sys.master_files m
inner join sys.databases d
on (m.database_id = d.database_id)
where d.name like 'tempdb'
order by 1, 2
Run Code Online (Sandbox Code Playgroud)
结果:http : //pastebin.com/Zu5fJ2hU
它显示了四个不同的辅助数据文件,其中没有一个出现在 sp_helpfile 中。如果我尝试使用 SQL Server 不允许使用的任何名称。这些文件都不存在于磁盘上。我的服务器是 SQL 2012 标准版。
我有一个 Sql server 2012 代理作业,它目前每分钟、每天等运行一次。
我想修改它,使其每天每分钟运行一次,星期六晚上 7:00 到 11:30 除外。作业调度程序可以做到这一点吗?
我尝试使用每日频率,我可以通过这种方式每天更改时间,但不能更改特定日期。
当前时间表:

sql-server ×10
permissions ×3
datafile ×1
identity ×1
iseries ×1
ssms ×1
t-sql ×1
tempdb ×1
truncate ×1