0

シナリオ : サーバーで完全な SQL サーバー バックアップを復元し、トランザクション ログを適用する管理ツールを C# で作成しています。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'

注 : 指定された値は実際の値に置き換えられます。

これらのスクリプトの実行中に例外をスローするものはほとんどありません。しかし、いくつかのスクリプトがエラーをスローしても続行したいです。また、サーバーに個別のdllを追加できないため、GO(バッチターミネーター)を削除しました。この問題を解決するためのアイデアを提案してください。

詳細 : プログラミング言語 : C# Db - Sql Server 2005,08

4

2 に答える 2

1

sを見逃すことはできませんGO。一部のステートメント ( などCREATE PROCEDURE) では、それらが独自の個別のバッチに存在することが重要です。

GOクライアント ツール (SSMS など) への指示であり、前のテキストをサーバーにバッチとして送信する必要があります (前のテキストGOまたはスクリプトの開始のどちらか遅い方)。したがって、コードを介してサーバーに SQL を送信する場合は、同じことを行う必要があります。または、テキストの解析について心配する必要がないように、各バッチを個別のテキストとして保存する必要があります (複数行の文字列について考えてください)。単語 GO を含む可能性のあるリテラル)。

バッチごとに (元のスクリプトでは最初は s で区切られGOていました)、それを別のバッチとしてサーバーに送信する必要があります。それには、次のバッチExecuteNonQueryを使用して新しいSqlCommandオブジェクトを作成します (または既存のオブジェクトのテキストを置き換えます)。実行されます。

次に、C# コードでの SQL 実行から発生したエラーを処理することを決定し、次のバッチの設定と実行に移ります。

于 2012-11-05T08:41:57.413 に答える
0

各「セクション」を独自のTry/Catch ブロックにラップすると、スクリプトはエラーを超えて続行できるはずです。エラーが発生した場合、スクリプトは単純に次の「セクション」にジャンプします。

また、MSDN ごとに: GO (Transact-SQL) :

GO は Transact-SQL ステートメントではありません。これは、sqlcmd ユーティリティと osql ユーティリティ、および SQL Server Management Studio コード エディターによって認識されるコマンドです。

于 2012-11-05T07:46:25.037 に答える