2009-10-19 5 views
0

나는 업그레이드하기 전에 데이터베이스에서 데이터를 백업하는 데 사용하는 SQL Server 저장 프로 시저를 가지고 있으며 매개 변수로 데이터베이스 이름을 전달하여 여러 데이터베이스에서 저장 프로 시저를 실행할 수 있기를 정말로 원합니다. . 이 작업을 수행하는 쉬운 방법이 있습니까? 내가 생각할 수있는 최선의 방법은 동적으로 SQL을 스토어드 프로 시저에 구현하는 것입니다.하지만 그렇게하는 것은 잘못된 방법입니다.다른 데이터베이스에서 SQL 쿼리를 어떻게 동적으로 실행합니까?

답변

1

이 작업을 수행하는 다른 방법이 없습니다. 동적 SQL이 유일한 방법입니다. 당신은 DB 이름을 통해 엄격한 통제를 가지고 누가 그것을 실행중인 경우, 당신은 모든 것을 함께 절단 괜찮아,하지만이 있는지 의심 사용 QUOTENAME 안전하게 매개 변수를 탈출 : 아무것도가 있다면, 분명히

CREATE PROCEDURE doStuff 
    @dbName NVARCHAR(50) 
AS 
    DECLARE @sql NVARCHAR(1000) 

    SET @sql = 'SELECT stuff FROM ' + QUOTENAME(@dbName) + '..TableName WHERE stuff = otherstuff' 

    EXEC sp_ExecuteSQL (@sql) 

을 이 후 안전과를 통해 동적 SQL에 대한 매개 변수가 전달되어 있는지 확인합니다

CREATE PROCEDURE doStuff 
    @dbName NVARCHAR(50) 
    @someValue NVARCHAR(10) 
AS 
    DECLARE @sql NVARCHAR(1000) 

    SET @sql = 'SELECT stuff FROM ' + QUOTENAME(@dbName) + '..TableName WHERE stuff = @pOtherStuff' 

    EXEC sp_ExecuteSQL (@sql, '@pOtherStuff NVARCHAR(10)', @someValue) 

: 더 다음 예를 들어, 다른 입력을 다시 한 번 확인하고, 잠재적으로 매개 변수화 동적 SQL을 사용하는 것이 좋습니다를 통해 전달되는 주사 공격에 대한 기회가 줄어 듭니다. 또한 쿼리와 관련된 실행 계획이 재사용 될 가능성을 높입니다.

0

개인적으로는 배치 파일과 셸을 sqlcmd와 같이 사용합니다. 그렇지 않으면 저장된 proc 디렉토리에 sql을 빌드하는 것이 좋습니다. 왜 그렇게하는 것이 "잘못"될지 확신하지 못합니다.

안부, 돈

0

MSSQL에는 OPENQUERY (dbname, statement) 함수가 있습니다. 서버가 연결된 경우 첫 번째 매개 변수로 지정하고 해당 서버에 대해 명령문을 실행합니다.

동적 프로 시저에서이 openquery 문을 생성 할 수 있습니다. 각 서버에서 백업 proc을 실행하거나 명령문을 직접 실행할 수 있습니다.

SSIS를 사용합니까? 그렇다면 몇 가지 ssis 패키지를 만들고 그 패키지를 예약하거나 원격으로 실행해볼 수 있습니다.

2

무엇이든 현재 데이터베이스를 백업하는 절차를 작성하십시오. 백업하려는 모든 데이터베이스에이 절차를 설치하십시오.

백업을 시작할 다른 절차를 작성하십시오. 이것은 언급하지 않은 것에 달려 있습니다. 예를 들어, 백업 할 각 데이터베이스의 이름이 들어있는 테이블 또는 이와 유사한 테이블이있는 경우와 같습니다. 기본적으로 당신이 할 필요가 데이터베이스 이름 돌이이며, 같은 캐릭터 라인을 구축 : 바로 다음

SET @ProcessQueryString= 
    'EXEC '+DatabaseServer+'.'+DatabaseName+'.dbo.'+'BackupProcedureName param1, param2' 

과 :

EXEC (@ProcessQueryString) 

가 원격으로 실행합니다.

관련 문제