Sql server AWS RDS for SQL Server-如何创建启动存储过程?
我们正在转向RDS,我们的一个应用程序需要访问tempdb,我正试图找出创建一个与RDS一起工作的启动作业的最佳方法。目前,我们可以创建一个存储过程,在主数据库中设置必要的权限,并使用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
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
)。免责声明:我不知道这是否真的有效。如果是这样的话,它将有一个好处,那就是使启动时运行的内容可见;启动过程不是很明显。