【问题标题】:How to setup sessionState with SQL Server mode on Amazon RDS如何在 Amazon RDS 上使用 SQL Server 模式设置 sessionState
【发布时间】:2018-09-25 12:57:40
【问题描述】:

我有 asp.net 应用程序,我打算将我的会话存储在 SQL Server 中。我正在使用 Amazon RDS(Microsoft SQL Server Express Edition)。我正在使用本地数据库进行测试,它在那里运行良好。

所以我尝试用下一行创建会话数据库

aspnet_regsql.exe -ssadd -sstype p -S mydb.rds.amazonaws.com -U myuser-P mypass

所以我的意思是它适用于本地数据库。但对于 Amazon RDS,我收到了下一个例外:

开始添加会话状态。

.. SQL文件执行过程中发生错误 “安装SqlState.sql”。 SQL 错误号是 229 并且 SqlException 消息是:EXECUTE 权限在 对象“sp_delete_job”,数据库“msdb”,模式“dbo”。如果工作确实 不存在,预计 msdb.dbo.sp_delete_job 会出错。 SQL 服务器:mydb.rds.amazonaws.com 数据库:aspnetdb 加载的 SQL 文件: 安装SqlState.sql

命令失败:

/* 删除所有表、启动过程、存储过程和类型。 */

/* 删除 DeleteExpiredSessions_Job */

DECLARE @jobname nvarchar(200) SET @jobname = N'ASPState' + '_Job_DeleteExpiredSessions'

-- 删除 [本地] 作业 -- 如果作业不存在,我们预计会出现错误。 PRINT '如果作业不存在,则 msdb.dbo.sp_delete_job 会出现错误 编辑。'

执行 msdb.dbo.sp_delete_job @job_name = @jobname

SQL 异常:System.Data.SqlClient.SqlException (0x80131904): 对象“sp_delete_job”,数据库的 EXECUTE 权限被拒绝 “msdb”,架构“dbo”。如果作业不存在,则来自 msdb.dbo.sp_delete_job 是预期的。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常, 布尔值中断连接)在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cm dHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, Tds ParserStateObject stateObj) 在 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(字符串 方法名,布尔异步)在 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult 结果,字符串方法名,布尔值 sendToPipe) 在 System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 在 System.Web.Management.SqlServices.ExecuteFile(字符串文件,字符串 服务器,字符串数据库,字符串 dbFileName,SqlConnection 连接, Boolean sessionState, Boolean isInstall, SessionStateType 会话状态类型)

有人知道解决这个问题的方法吗?这会创建一个数据库,但它是不完整的。

【问题讨论】:

    标签: asp.net session-state amazon-rds


    【解决方案1】:

    我已经解决了在 Amazon RDS 上创建会话数据库的问题。

    1. 使用以下工具 SQLAzureMW v5.15.6 Release Binary for SQL Server 2014 在 AWS RDS 和数据库和架构迁移上创建 ASPState DB。
    2. 在 sessionState mode="SQLServer" allowCustomSqlDatabase="true" sqlConnectionString="data source=amazon-server-name;initial catalog=ASPState;persist security info=True;user id=userid;password=password"时更改数据库名称cookieless="false" timeout="100">

    【讨论】:

    • 看起来 MS 现在已经添加了这种可能性。我现在无法检查,但无论如何感谢您的回答。
    【解决方案2】:

    可以在 SQL RDS 上使用 sql server 会话状态。

    您只需注释掉与创建 SQL Server 代理作业有关的 InstallSqlState.sql 部分。该脚本在运行 aspnet_regsql.exe 命令时使用。它位于该 exe 旁边的框架文件夹中。它不会优雅地处理未能创建作业的情况,因此它不会执行任何其他步骤来安装会话状态。

    这是我的 InstallSqlState.sql 最终的样子: http://pastebin.com/QJDXC093

    或者,您也可以在您有权创建作业的数据库上运行 aspnet_regsql.exe 命令,然后使用 Management Studio 中的导入/导出功能将生成的数据库架构从您的数据库移动到 RDS。

    【讨论】:

    • 感谢您的评论。当我正确时,我无法在 Amazone RDS 上建立 sql 作业,对吗?建立没有工作的状态数据库没有意义。因为 DB 会增长得非常快(作业清除过期会话的记录)。
    • 你是对的。您可以在另一台服务器上设置操作任务以按计划运行 sql 脚本以清理这些。这取决于您,但这取决于您对 RDS 好处的渴望程度。我们现在只是在测试系统上使用 RDS,所以这不是我们关心的问题。
    • 正如我所提到的,我在 EC2 服务上安装了 MS SQL(选择了额外的驱动器等),我认为没有任何理由为两项服务付费,因为我只能使用一项。
    • 您还可以根据一些 URL 请求运行清理脚本 - 例如对您网站的每 x 个请求中的一个 url 进行一次额外的 javascript GET 调用。不是理想的解决方案,但它可以完成工作。同样,这完全取决于您对 RDS 好处的渴望程度(即托管 sql server 实例)。这取决于您的具体用例和个人喜好。
    猜你喜欢
    • 2014-03-17
    • 1970-01-01
    • 2018-09-01
    • 2012-05-17
    • 2013-02-25
    • 1970-01-01
    • 2015-01-17
    • 2013-04-01
    • 2010-12-11
    相关资源
    最近更新 更多