sql - 向 SQL Server 用户授予执行权限以仅运行特定作业

标签 sql sql-server stored-procedures jobs

我请求创建可由特定 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 代理中可用的其他作业:

  1. 创建作业时(查看示例引用),将所需的登录名称包含在参数@owner_login_name中,作为作业所有者
  2. 确保映射为作业所有者(在步骤 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/

相关文章:

c# - 由同一台本地计算机上的多个应用程序并发访问轻量级/(嵌入式?)SQL 数据库?

sql-server - 在 SQL Server Management Studio 中更改维护计划

python - 数据类型 nvarchar 和 ntext 在等于运算符中不兼容。 (402) (SQLExecDirectW)') || SqlAlchemy、Sql Azure

sql-server - 我的 PIVOT 返回重复行,每行中包含数据透视列值

postgresql - 在 Postgresql 存储过程中使用准备好的语句或动态命令?

php - Laravel 5.3 中的程序问题

mysql - 获取包含在表中找到最少次数的项目的列表

MySQL从具有特定键的表中选择*

sql - 将单个日期值转换为日期间隔

sql - 修剪字符串中的空格 - LTRIM RTRIM 不起作用