Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server AWS RDS for SQL Server-如何创建启动存储过程?_Sql Server_Amazon Web Services_Amazon Rds - Fatal编程技术网

Sql server AWS RDS for SQL Server-如何创建启动存储过程?

Sql server AWS RDS for SQL Server-如何创建启动存储过程?,sql-server,amazon-web-services,amazon-rds,Sql Server,Amazon Web Services,Amazon Rds,我们正在转向RDS,我们的一个应用程序需要访问tempdb,我正试图找出创建一个与RDS一起工作的启动作业的最佳方法。目前,我们可以创建一个存储过程,在主数据库中设置必要的权限,并使用EXEC sp_proc选项'AddPermissionsToTempDb','startup','true'命令将其设置为启动时启动 然而,在RDS中,我们无法在主数据库中创建存储过程。我尝试在用户拥有的数据库中创建存储过程,但当我尝试使用EXEC sp_procoption“mydb.dbo.AddPermis

我们正在转向RDS,我们的一个应用程序需要访问tempdb,我正试图找出创建一个与RDS一起工作的启动作业的最佳方法。目前,我们可以创建一个存储过程,在主数据库中设置必要的权限,并使用
EXEC sp_proc选项'AddPermissionsToTempDb','startup','true'
命令将其设置为启动时启动


然而,在RDS中,我们无法在主数据库中创建存储过程。我尝试在用户拥有的数据库中创建存储过程,但当我尝试使用
EXEC sp_procoption“mydb.dbo.AddPermissionsToTempDb”、“startup”、“true”创建启动作业时,它说找不到存储过程或我没有权限。。。有没有其他方法可以在RDS上实现这一点?

能够找到一个基于此的解决方案,因此他们得到了好评。以下是我用来创建启动作业的完整查询,该作业用于向用户列表授予权限,以在AWS RDS SQL Server实例的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

您可以尝试使用调度在代理启动时运行的作业(
sp\u add\u jobschedule
,将
@freq\u type
设置为
64
)。免责声明:我不知道这是否真的有效。如果是这样的话,它将有一个好处,那就是使启动时运行的内容可见;启动过程不是很明显。