0

시나리오 : 서버에서 전체 SQL Server 백업을 복원하고 트랜잭션 로그를 적용하는 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 서버에 2005,08

답변

1

GO을 놓칠 수 없습니다. 일부 진술 (예 : CREATE PROCEDURE)은 별도의 배치로 존재하는 것이 중요합니다.

GO은 클라이언트 도구 (예 : SSMS)에 이전 텍스트 (이전 GO으로 돌아 가기 또는 스크립트 시작 중 늦은 쪽)를 배치로 보내야한다는 지시입니다. 따라서 코드를 통해 서버에 SQL을 보내는 경우 똑같은 작업을 수행해야합니다. 또는 각 배치를 별도의 텍스트로 저장해야 텍스트를 파싱 할 필요가 없습니다 (여러 줄 문자열 단어 GO를 포함 할 수있는 리터럴). 다음 새 SqlCommand 객체를 생성 (또는 텍스트를 교체 - (원래 원래 스크립트에 GO들로 구분) 각 배치, 당신은 ExecuteNonQuery 또는 유사한를 호출하여 서버에 별도의 일괄 처리로 있음을 보낼 필요가 들어

기존의 것)을 실행할 다음 배치와 비교합니다.

그런 다음 C# 코드에서 SQL 실행으로 발생한 오류를 처리하고 다음 배치를 설정하고 실행하기로 결정할 수 있습니다.

+0

안녕하세요. 감사. 한 가지 의심. 분리 된 배치에 "use db"가 포함되어 있으면 사용 여부가 필요합니다. –

+0

@ Yes-kaY - 대개는 - 또는 별도의 데이터베이스를 다루는 경우 적절한 연결 문자열을 사용하여 별도의'SqlConnection' 개체를 만들 수 있습니다. –

+0

@ Damien_The_Unbeliever - 고마워. 대단히 필요하다. 다시 한번 감사드립니다. –

0

랩 각각 "섹션"그것의 스크립트가 오류가 더 이상 진행 할 수 있어야한다 Try/Catch Block & 자신. 오류가 발생하면 스크립트는 다음 "섹션"으로 바로 이동합니다. 또한

, MSDN: GO (Transact-SQL) 당 :

GO는 Transact-SQL 문 아니다; sqlcmd 및 osql 유틸리티와 SQL Server Management Studio 코드 편집기에서 인식하는 명령입니다.

관련 문제