글로벌 변수 또는 임시 테이블을 사용하는 이유는 무엇입니까? 이것은 나에게 사용자 정의 스토어드 프로 시저가되도록 울부 짖는다.
다음은 비즈니스 규칙입니다.
1 - 기본적으로 분리하려는 데이터베이스의 위치와 크기를 가져오고 싶습니다.
2 - 단일 사용자 모드로 데이터베이스를 설정하고 싶습니다.
3 - 데이터베이스를 분리하려고합니다. 나중에 파일이 주위에 걸려있을 것입니다.
MSDB 데이터베이스에서 만들었지 만 도구 상자 데이터베이스에 저장할 수 있습니다.
데이터베이스가 실제로 사용 전용 모드인지 확인하지 않았습니다. - TODO 목록
sys.databases 테이블에서 모드를 확인하십시오. ALTER가 실패하면 분리를 시도하지 마십시오. 사용자에게 spids를 찾아서 죽일 것을 알리십시오.
http://technet.microsoft.com/en-us/library/ms178534.aspx
4 - 난에 처리 오류를 두지 않았다 -. TODO 목록
을하지 적어도 마지막으로,이 솔루션은 SQL 주입하는 경향이있을 수, 세계 액세스 권한을 부여하지 않습니다.
간단히 말해, 아래의 저장 프로 시저는 원하는대로 처리합니다.
--
-- Create a user stored procedure
--
-- Start in msdb
use msdb
go
-- drop existing
if object_id('my_detach_process') > 0
drop procedure my_detach_process
go
-- create new
create procedure my_detach_process(@dbname sysname)
as
-- Show the data
SELECT
DB_NAME(mf.database_id) AS DatabaseName,
mf.name AS LogicalName,
mf.physical_name AS PhysicalName, mf.size as SizeMb
FROM sys.master_files AS mf
WHERE DB_NAME(database_id) = @dbname;
-- Set to single user
DECLARE @sqlstmt1 nvarchar(512) = '';
SET @sqlstmt1 = 'ALTER DATABASE [' + @dbname + '] SET SINGLE_USER WITH ROLLBACK IMMEDIATE';
EXEC sp_executesql @sqlstmt1;
-- Detach
DECLARE @sqlstmt2 nvarchar(512) = '';
SET @sqlstmt2 = 'USE [master]; EXEC master.dbo.sp_detach_db @dbname = ' + @dbname;
EXEC sp_executesql @sqlstmt2;
GO
--
-- Sample call
--
-- Choose master
use master
go
-- Create toy db
create database toy;
go
-- Call the sp
exec msdb.dbo.my_detach_process @dbname = 'Toy'
샘플 호출의 샘플 출력.
난 당신이 [SQLCMD 모드 - 여기 예]를 사용하여 할 말은 생각 (http://dba.stackexchange.com/questions/46244/setting-variables-in-sqlcmd-mode).적어도 변수가 아니라면 Management Studio에서 일반 T-SQL을 사용하여이 작업을 수행 할 수 없습니다. –
변수를 SSIS 패키지에 저장하고 원하는만큼 많은 SQL 실행 작업을 전달할 수 있습니다. 그 종류의 일이 너의 골목에 있다면. – Zane