我请求创建可由特定 SQL 用户运行的 SQL Server 代理作业。
如果不授予用户对 sp_start_job
存储过程的执行权限(这意味着他也可以运行所有其他禁止的作业),如何才能完成此操作?
最佳答案
How can this be done without giving the user execute permission to sp_start_job stored procedure meaning that he could run all the other prohibited jobs too?
通常,分配给 SQLAgentUserRole
(msdb
中的数据库角色)的用户只能访问该用户作为所有者的 SQL 作业,
根据您的情况,您可以应用如下简单步骤
以下步骤创建一个可由登录
执行的作业,并且相同的登录
无法运行 SQL 代理中可用的其他作业:
- 创建作业时(查看示例引用),将所需的
登录
名称包含在参数@owner_login_name
中,作为作业所有者 - 确保映射为作业所有者(在步骤 1 中)的
Login
不属于Sysadmin
固定服务器角色和SQLAgentOperatorRole
msdb 数据库角色,但只是SQLAgentUserRole
角色的一部分,您可以使用以下脚本执行此操作(将单词 Loginname 替换为您自己的)
ALTER SERVER ROLE SYSADMIN DROP MEMBER LoginName;
USE MSDB;
CREATE USER LoginName FOR LOGIN LoginName;
ALTER ROLE SQLAGENTUSERROLE ADD MEMBER LoginName;
ALTER ROLE SQLAgentOperatorRole drop MEMBER LoginName;
创造就业机会示例引用
该脚本创建一个作业并逐步通过sqlcmd
执行T-SQL命令,运行此作业的用户不需要数据库中特定对象的权限。
在运行以下创建作业的脚本之前,您需要更改@command
参数。或者您可以稍后(创建作业后)通过SSMS - SQL Agent -> 作业属性
注意:SQL代理服务必须由Windows/域用户帐户运行,并且服务帐户用户需要对对象(过程)具有权限
USE [msdb]
GO
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Cmd Test With Service Account',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=0,
@notify_level_netsend=0,
@notify_level_page=0,
@delete_level=0,
@description=N'No description available.',
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'sa', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object: Step [Test] Script Date: 8/27/2019 5:30:58 PM ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Cmd Test With Service Account',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_success_step_id=0,
@on_fail_action=2,
@on_fail_step_id=0,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0, @subsystem=N'CmdExec',
@command=N'"C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn\SQLCMD.EXE" -S Localhost,1534 -Q "exec YourDatabase.dbo.YourProcedure"',
@flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
GO
关于sql - 向 SQL Server 用户授予执行权限以仅运行特定作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57623638/