简体   繁体   English

SQL 服务器的 AWS RDS - 如何创建启动存储过程?

[英]AWS RDS for SQL Server - how to create startup stored proc?

We are moving to RDS and one of our apps needs access to tempdb and I am trying to figure out the best way to create a startup job that works with RDS.我们正在转向 RDS,我们的一个应用程序需要访问 tempdb,我正在尝试找出创建与 RDS 一起使用的启动作业的最佳方法。 Currently we are able to create a stored proc that sets up the necessary permissions in the master database and use the EXEC sp_procoption 'AddPermissionsToTempDb', 'startup', 'true' command to set it to start at boot.目前我们能够创建一个存储过程,在主数据库中设置必要的权限,并使用EXEC sp_procoption 'AddPermissionsToTempDb', 'startup', 'true'命令将其设置为在启动时启动。

In RDS however we are not able to create stored procs in the master database.然而,在 RDS 中,我们无法在 master 数据库中创建存储过程。 I tried creating the stored proc in a user-owned db but when I then try to create the startup job with EXEC sp_procoption 'mydb.dbo.AddPermissionsToTempDb', 'startup', 'true' it says it can't find the stored procedure or I do not have permission... Is there another way to accomplish this on RDS?我尝试在用户拥有的数据库中创建存储过程,但是当我尝试使用EXEC sp_procoption 'mydb.dbo.AddPermissionsToTempDb', 'startup', 'true'创建启动作业时,它说找不到存储过程或者我没有权限...是否有另一种方法可以在 RDS 上完成此操作?

Was able to find a solution based on Jeroen Mostert's comment so credit goes to them.能够根据Jeroen Mostert 的评论找到解决方案,因此归功于他们。 Here is the full query I used to create the startup job to grant permissions to a list of users to create, control and execute stored procedures on tempdb on an AWS RDS SQL Server instance:下面是我用来创建启动作业以向用户列表授予权限以在 AWS RDS SQL 服务器实例上的 tempdb 上创建、控制和执行存储过程的完整查询:

USE msdb
go

declare @job_name varchar(50)
set @job_name = 'AddTempDBPermissionsOnStartup'

exec dbo.sp_delete_job @job_name =  @job_name

declare @sql varchar(max)
select @sql = '
Declare @Users Table (username varchar(100) )
insert @Users(username) values (''[user1]''),
(''[user2]''),
(''[user3]'')

use tempdb
CREATE ROLE sp_executor GRANT EXECUTE TO sp_executor
CREATE ROLE sp_manipulator 
GRANT CREATE PROCEDURE TO sp_manipulator
GRANT CONTROL TO sp_manipulator

DECLARE @username as NVARCHAR(100);
DECLARE User_Cursor CURSOR FOR  
    SELECT * from @Users
OPEN User_Cursor;
FETCH NEXT FROM User_Cursor INTO @username;
WHILE @@FETCH_STATUS = 0  
    BEGIN
        PRINT @username
    IF EXISTS(SELECT * FROM [tempdb].sys.database_principals WHERE type_desc = ''SQL_USER'' AND name = @username)
        PRINT ''  - user already exists''
    ELSE
        BEGIN
            PRINT ''  - creating user''
            DECLARE @Sql VARCHAR(MAX)
            SET @Sql =
            ''USE Tempdb'' + char(13) + 
            ''CREATE USER '' + @username + '' FOR LOGIN '' + @username  + char(13) +
            ''EXEC sp_addrolemember sp_executor, '' + @username + char(13) +
            ''EXEC sp_addrolemember sp_manipulator, '' + @username
            EXEC (@Sql)
        END
    FETCH NEXT FROM User_Cursor INTO @username;
END;
CLOSE User_Cursor;
DEALLOCATE User_Cursor;
GO
'


--Add a job
EXEC dbo.sp_add_job
    @job_name = @job_name ;

--Add a job step to run the command
EXEC sp_add_jobstep
    @job_name = @job_name,
    @step_name = N'job step',
    @subsystem = N'TSQL',
    @command = @sql

--Schedule the job to run at startup
exec sp_add_jobschedule @job_name = @job_name,
@name = 'RunAtStartSchedule',
@freq_type=64

 --Add the job to the SQL Server Server
EXEC dbo.sp_add_jobserver
    @job_name = @job_name

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM