我在工作组中有两台Windows Server 2012 R2服务器,第一台服务器上有MS SQL Server,另一台服务器(其中包括)用作备份存储。在数据库服务器上,SQL Server数据库引擎和SQL Server代理都使用默认虚拟帐户运行 - NT Service \ MSSQLSERVER和NT Service \ SQLSERVERAGENT。
现在,我想使用Ola Hallengren维护作业来备份我的MS SQL Server数据库。这些脚本包装在SQL Server代理作业中,但备份是一个t-sql过程,因此由SQL Server数据库引擎使用NT Service \ MSSQLSERVER执行。
我在存储服务器上创建了一个帐户,并且该帐户具有此帐户的访问权限。我能够使用net use命令连接数据库服务器上的共享,为创建的帐户提供凭据。 有一个问题:共享是为运行net use命令的帐户连接的。
如果我使用本地系统帐户(应该是所有用户)连接共享,那么NT Service \ MSSQLSERVER仍然无法访问它,任何其他帐户都无法访问。似乎hack previously proposed on stackoverflow已在Windows Server 2012 R2中得到修复。
如果我将net use命令作为SQL Server代理作业中的一个步骤运行,则使用其他虚拟帐户 - NT Service \ SQLSERVERAGENT完成 - 并且备份步骤失败并显示“找不到文件夹”错误。
因此,我想了解一种使用all the necessary permissions创建Windows服务帐户的方法,以便在工作组环境中使用SQL Server数据库引擎服务。或解释为什么不能这样做。 理想情况下,它应该是一个脚本 - Powershell或VBScript。
我尝试将SQL Server Dabase Engine和SQL Server代理作为本地系统运行,备份就像魅力一样。但我不认为这是一个解决方案,因为从安全角度来看不建议这样做。
此外,由于安全原因相同,我不会考虑使用xp_cmdshell运行net use命令的解决方案。
答案 0 :(得分:0)
好的,完成它的正确方法是执行以下操作:
.\UserName
而不是ServerName\UserName
,则可以执行此操作。 NT Service\MSSQLSERVER
的权限。这可以通过使用SubInACL实用程序来完成。此工具由Microsoft专门为此目的创建,可以从官方Microsoft下载中心下载。或者您可以跳过嗅探实际权限并继续下一步。可能应该去superuser.com
答案 1 :(得分:-1)
是否可以使用SSISpackage执行以下操作:
实施例: https://www.simple-talk.com/sql/ssis/adding-the-script-task-to-your-ssis-packages/
使用T-sql创建批处理文件:
--Set first day of Week to Monday
--Value First day of the week is
--1 Monday
--2 Tuesday
--3 Wednesday
--4 Thursday
--5 Friday
--6 Saturday
--7 (default, U.S. English) Sunday
SET DATEFIRST 1
Declare @CmdSource varchar(100),
@CmdDestination varchar(100),
@Year varchar(4),
@Week varchar (2),
@Difference int
Set @Difference = 0
Set @Year = Convert(varchar(4), DatePart(Year, GetDate()-@Difference))
Set @Week = Convert(varchar(2), DatePart(week, GetDate()-@Difference))
If @Year = '2010'
BEGIN
Set @Week = @Week - 1
END
SELECT @Week =
CASE Len(@Week)
WHEN 1
THEN '0' + @Week
else @Week
END
Set @CmdSource = 'XCopy "<sourcepath>' + @Year + '\extras text' + @Year + @Week + '.bak" '
Set @CmdDestination = '"<Destination path>" /Y'
SELECT @CmdSource + @CmdDestination as Batchfile
我们选择在设定的时间创建文件。然后,我们设置一个单独的Windows计划任务,以便在创建后的设定时间独立于SQL运行。在那个时候与SSIS一起运行2010是不可预测的。只有一个非常长的目标列(长度为200,由您决定多长时间。)
答案 2 :(得分:-1)
恕我直言,你最好的选择仍然是在xp_cmdshell中运行net use \\remotehost\folder password /user:remotehost\username
。
你只需要运行一次然后再关闭xp_cmdshell如果你不喜欢它;它不像改变那个选项需要重启=)
为此我建议将其放入&#39; startup&#39;程序。您甚至可以添加WITH RECOMPILE
,如果您担心有人会sp_helptext
找到该登录的密码。然后,当找到加密=)
USE master
GO
CREATE PROCEDURE sp_net_use_that_other_server
AS
-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1;
-- To update the currently configured value for advanced options.
RECONFIGURE;
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1;
-- To update the currently configured value for this feature.
RECONFIGURE;
-- you might want to fetch this dynamically from the database somewhere, or simply leave it hardcoded here...
EXEC master..xp_cmdshell 'net use \\remotehost\folder password /user:remotehost\username'
-- To disable the feature.
EXEC sp_configure 'xp_cmdshell', 0;
-- To update the currently configured value for this feature.
RECONFIGURE;
Return
GO
-- set this up as a startup procedure
EXEC sp_procoption @ProcName = 'sp_net_use_that_other_server'
, @OptionName = 'startup'
, @OptionValue = 'on';
GO
之后,数据库引擎应该能够BACKUP DATABASE...
到该共享。