从存储过程执行备份数据库只能在本地运行,而不能在生产环境中使用

时间:2019-06-06 18:44:06

标签: javascript php sql-server

我需要通过Web应用程序上的一个clic按钮来备份数据库。我将代码放在由clic调用的SP中,它创建一个.bak并将其存储在服务器文件夹中。 可以直接在SQL SERVER中完美地执行SP,单击本地Web应用程序中的按钮即可,而在生产环境中则无需这样做。

本地代码和生产代码相同。

我尝试过多种方式进行BK:

  • 将数据库DATABASENAME备份到磁盘= @route
  • 设置@query ='将数据库DATABASENAME备份到磁盘='+''''+ @route +'''' exec(@query) 将信息捕获到变量中。
  • 设置@query ='将数据库DATABASENAME备份到磁盘='+''''+ @route +'''' exec @respuesta = sp_executesql @query

同样,所有这些方式都在本地有效,但在生产中无效。

这是我的SP:

ALTER procedure [dbo].[sp_IWBackupDatabase]
as
begin
declare @route nvarchar(500), @query nvarchar(1000), @respuesta int = 1
set nocount on
set @route = 'I:\SERVERFOLVER\BackupDB\DATABASENAMEFull.bak'

begin try
backup database DATABASENAME to disk = @route
set @respuesta = 0
end try
begin catch
set @respuesta = 1
end catch

select @respuesta Respuesta
end

这是我打来的JS电话:

function BackupDatabase() {
    $.post('main.php', {
        action: 'BackupDatabase'
    }, function(e) {
        if (e.error) {
            if (e.r == "SQLSTATE[IMSSP]: The active result for the query contains no fields.") {
                Core.ShowNotific8('It WORKS', 'lime', false);
                DBWasBackUp = 1;
                $('#btn_CreateDBBK').attr('disabled', 'disabled');
            } else {
                Core.ShowNotific8('It NOT WORKS', 'ruby', false);
                DBWasBackUp = 0;
                $('#btn_CreateDBBK').removeAttr('disabled');
            }
        } else {
            if (e.r[0]['Respuesta'] == '0') {
                Core.ShowNotific8('It WORKS', 'lime', false);
                DBWasBackUp = 1;
                $('#btn_CreateDBBK').attr('disabled', 'disabled');
            } else {
                Core.ShowNotific8('It NOT WORKS', 'ruby', false);
                DBWasBackUp = 0;
                $('#btn_CreateDBBK').removeAttr('disabled');
            }
        }

    });
    return false;
}

最后,这是PHP的调用:

function BackupDatabase()
{
$cnx = $this->connectSqlSrv():
$sth = $cnx->prepare("Exec sp_IWBackupDatabase");
$retval json_encode($retval);
}

1 个答案:

答案 0 :(得分:0)

可能是权限。当您在VS下运行站点时,该用户将以本地Windows用户身份运行。当您部署到IIS时,它以应用程序池用户身份运行。通过转到IIS>网站>右键单击“网站”>“管理WebSite”>“高级设置”,检查运行此用户的用户。那是该用户以其身份运行,并且该用户可能需要具有SQL访问权限。如果您需要添加新的应用程序池,请点击此处:https://docs.microsoft.com/en-us/iis/configuration/system.applicationhost/applicationpools/add/#how-to