我在工作组中有两台Windows Server 2012 R2服务器,第一台是MS SQL Server,另一台用作备份存储。 在数据库服务器上,SQL Server数据库引擎和SQL Server代理都使用默认虚拟帐户 – NT Service \ MSSQLSERVER和NT Service \ SQLSERVERAGENT运行。
现在,我想使用Ola Hallengren维护作业来备份我的MS SQL Server数据库。 这些脚本被封装到SQL Server代理作业中,但备份是由SQL Server数据库引擎与NT Service \ MSSQLSERVER执行的t-sql过程。
我在存储服务器上创build了一个帐户,并为此帐户创build了一个具有访问权限的共享文件夹。 我能够使用net use命令连接数据库服务器上的共享,并为创build的帐户提供凭据。 有一个问题:共享连接了一个运行net use命令的帐户。
如果我使用本地系统帐户(应该是所有用户)连接共享,那么NT Service \ MSSQLSERVER仍然无法访问它,任何其他帐户都不可以。 看起来好像以前在Windows Server 2012 R2 上提出的对于计算器的提议已经被修复。
如果我将net use命令作为SQL Server代理作业中的一个步骤运行,则使用另一个虚拟帐户(NT Service \ SQLSERVERAGENT)完成此操作,并且备份步骤将失败,并显示“未find文件夹”错误。
所以我想知道一种方法来创build一个Windows服务帐户,具有在工作组环境中使用SQL Server数据库引擎服务所需的所有权限 。 或者为什么不能做的解释。 理想情况下,它应该是一个脚本 – Powershell或VBScript。
我试图运行SQL Server数据库引擎和SQL Server代理作为本地系统,备份工作就像一个魅力。 但是我不认为这是一个解决scheme,因为从安全的angular度来看这不是一个好的build议。
此外,我不会考虑一个解决scheme来运行net use命令与xp_cmdshell由于相同的安全原因。
是否可以使用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, US 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运行。 在2010年的时候用SSIS运行是不可预知的。 只有一个非常长的目的地栏(长度200,直到你多久。)
恕我直言,你最好的选择仍然是在xp_cmdshell中运行net use \\remotehost\folder password /user:remotehost\username
。
你只需要运行一次,然后再关闭xp_cmdshell,如果你不喜欢的话; 这不像改变这个选项需要重新启动=)
为此,我建议把这个“启动”程序。 你甚至可以添加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...
分配给该共享。
好的,正确的方法是做到以下几点:
.\UserName
而不是serverName\UserName
则可以完成此操作。 NT Service\MSSQLSERVER
权限。 这可以通过使用SubInACL实用程序完成。 此工具是由Microsoft创建完全为此目的,可以从官方Microsoft下载中心下载。 或者你可以跳过嗅探实际的权限,然后继续下一步。 可能这应该去superuser.com