场景: 我在C#中创建一个管理工具,它将在服务器中恢复完整的sql server备份并应用事务日志。 db出现之后。我运行了一些如下所示的脚本。
use master
EXEC sp_addlogin '<destsid>', '<sidadmpass>','<dbname>'
use <dbname>
EXEC sp_grantdbaccess '<destsid>'
EXEC sp_addrolemember 'db_owner', '<destsid>'
EXEC sp_change_users_login 'Update_One','<destsid>','<destsid>'
use master
EXEC sp_grantdbaccess '<destsid>'
EXEC sp_addrolemember 'db_owner', '<destsid>'
use msdb
EXEC sp_grantdbaccess '<destsid>'
EXEC sp_addrolemember 'db_owner', '<destsid>'
use model
EXEC sp_grantdbaccess '<destsid>'
EXEC sp_addrolemember 'db_owner', '<destsid>'
use tempdb
EXEC sp_grantdbaccess '<destsid>'
EXEC sp_addrolemember 'db_owner', '<destsid>'
use master
grant all on xp_cmdshell to <destsid>
EXEC sp_addsrvrolemember '<destsid>', 'serveradmin'
EXEC sp_addsrvrolemember '<destsid>', 'dbcreator'
EXEC sp_addsrvrolemember '<destsid>', 'bulkadmin'
use <dbname>
if object_id('sp_change_sapuser') is not null
drop procedure sp_change_sapuser
create procedure sp_change_sapuser @oldid sysname, @newid sysname
as begin
declare @oldid_uid smallint
declare @newid_uid smallint
declare @object sysname
declare @object_full nvarchar(999)
set @oldid_uid = user_id(@oldid)
set @newid_uid = user_id(@newid)
if @oldid_uid is not null and @newid_uid is not null
begin
declare object_cursor cursor local for
select name from sysobjects where((xtype='U' and name <> 'dtproperties') or (xtype='V' and name not in ('syssegments','sysconstraints')) or (xtype='P' and name not like 'dt_%') or (xtype='D' and name not like 'DF__dtpropert%') or (xtype in ('FN','TF','IF'))) and @oldid_uid = uid
open object_cursor
fetch next from object_cursor into @object
while @@fetch_status=0
begin
set @object_full = user_name(@oldid_uid) + '.' + @object
exec sp_changeobjectowner @object_full, @newid
fetch next from object_cursor into @object
end
end
else
if @oldid_uid is null
begin
print '*** old database user does not exist ***'
end
if @newid_uid is null
begin
print '*** new database user does not exist ***'
end
end
exec sp_change_sapuser '<sourcesid>', '<destsid>'
use master
EXEC sp_grantlogin 'AMR\<destsid>adm'
EXEC sp_grantlogin 'AMR\SAPService<dbname>'
EXEC sp_defaultdb 'AMR\<destsid>adm','<dbname>'
EXEC sp_defaultdb 'AMR\SAPService<dbname>','<dbname>'
EXEC sp_addsrvrolemember 'AMR\<destsid>adm', 'sysadmin'
EXEC sp_addsrvrolemember 'AMR\SAPService<dbname>', 'sysadmin'
EXEC xp_sqlagent_proxy_account 'SET', '<servername>', 'SAPMssXPUser',N'<sidadmpass>'
use master
EXEC sp_addlogin '<destsid>', '<sidadmpass>', <dbname>
use <dbname>
EXEC sp_change_users_login 'Update_One','<destsid>','<destsid>'
EXEC sp_grantdbaccess '<destsid>'
EXEC sp_addrolemember 'db_owner', '<destsid>'
use master
EXEC sp_grantdbaccess '<destsid>'
EXEC sp_addrolemember 'db_owner', '<destsid>'
use msdb
EXEC sp_grantdbaccess '<destsid>'
EXEC sp_addrolemember 'db_owner', '<destsid>'
use model
EXEC sp_grantdbaccess '<destsid>'
EXEC sp_addrolemember 'db_owner', '<destsid>'
use tempdb
EXEC sp_grantdbaccess '<destsid>'
EXEC sp_addrolemember 'db_owner', '<destsid>'
use master
grant all on xp_cmdshell to <destsid>
EXEC sp_addsrvrolemember '<destsid>', 'serveradmin'
EXEC sp_addsrvrolemember '<destsid>', 'dbcreator'
EXEC sp_addsrvrolemember '<destsid>', 'bulkadmin'
--EXEC xp_sqlagent_proxy_account 'SET', '<servername>', 'SAPMssXPUser', N'<sidadmpass>'
EXEC sp_grantlogin '<destsid>adm'
EXEC sp_grantlogin 'SAPService<dbname>'
EXEC sp_defaultdb '<destsid>adm','<dbname>'
EXEC sp_defaultdb 'SAPService<dbname>','<dbname>'
EXEC sp_addsrvrolemember '<destsid>adm', 'sysadmin'
EXEC sp_addsrvrolemember 'SAPService<dbname>', 'sysadmin'
注意:给定的值将替换为实际值。
运行这些脚本时,很少会抛出异常。但我想继续,即使一些脚本抛出错误。而且我已经删除了GO(批量终止符)因为我无法将单独的dll添加到服务器中。请提出一些想法,以解决这个问题。
详情: 编程语言:C# Db - Sql Server 2005,08
答案 0 :(得分:1)
你不能错过GO
。对于某些陈述(例如CREATE PROCEDURE
),重要的是它们存在于各自的批次中。
GO
是对客户端工具(例如SSMS)的指令,它应该将前面的文本(返回到上一个GO
或脚本的开头,以较晚者为准)发送到服务器一批。因此,如果您通过代码将SQL发送到服务器,您应该做同样的事情 - 或者将每个批处理存储为单独的文本片段,这样您就不必担心解析文本了(想想多行字符串)可能包含单词GO)的文字。
对于每个批处理(最初由原始脚本中的GO
分隔),您需要通过调用ExecuteNonQuery
或类似的方式将其作为单独的批处理发送到服务器 - 然后创建一个新的{{ 1}} object(或替换现有文本的文本)与要执行的下一批。
然后,您可能决定在C#代码中处理来自SQL执行的任何错误,然后转到设置下一批并执行它。
答案 1 :(得分:0)
将每个“部分”包裹在其自己的Try/Catch Block&amp;您的脚本应该能够继续执行任何错误。如果遇到错误,脚本将只跳转到下一个“部分”。
另外,根据MSDN: GO (Transact-SQL):
GO不是Transact-SQL语句;它是sqlcmd和osql实用程序以及SQL Server Management Studio代码编辑器识别的命令。