sql 스크립트에서 "기존 연결 닫기"를 지정하려면 어떻게 해야 합니까?
SQL Server 2008에서 스키마를 적극적으로 개발하고 있으며 데이터베이스 스크립트를 드롭/작성하고 싶은 경우가 자주 있습니다.내가 달릴 때
USE [master]
GO
IF EXISTS (SELECT name FROM sys.databases WHERE name = N'MyDatabase')
DROP DATABASE [MyDatabase]
GO
이 에러는 자주 발생합니다.
Msg 3702, Level 16, State 4, Line 3
Cannot drop database "MyDatabase" because it is currently in use.
개체 탐색기 창에서 데이터베이스를 마우스 오른쪽 버튼으로 클릭하고 컨텍스트 메뉴에서 삭제 작업을 선택하면 "기존 연결 닫기" 체크박스가 나타납니다.
스크립트에서 이 옵션을 지정할 수 있는 방법이 있습니까?
다음을 사용하여 모든 사용자의 연결을 끊고 트랜잭션을 롤백할 수 있습니다.
alter database [MyDatbase] set single_user with rollback immediate
그 후 데이터베이스를 안전하게 폐기할 수 있습니다.
Management Studio로 이동하여 설명하는 모든 작업을 수행합니다.단, OK(확인)를 클릭하지 않고 Script(스크립트)를 클릭합니다.실행할 코드가 표시됩니다.이 코드는 스크립트에 포함할 수 있습니다.
이 경우 필요한 것은 다음과 같습니다.
ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE SET 문서에 따르면 데이터베이스를 SINGLE_USER 모드로 설정한 후에도 해당 데이터베이스에 액세스할 수 없습니다.
데이터베이스를 SINGLE_USER로 설정하기 전에 AUTO_UPDATE_STATISTICS_ASYC 옵션이 OFF로 설정되어 있는지 확인합니다.ON으로 설정하면 통계 업데이트에 사용되는 백그라운드 스레드가 데이터베이스에 연결되어 단일 사용자 모드에서 데이터베이스에 액세스할 수 없습니다.
따라서 기존 연결을 사용하여 데이터베이스를 삭제하는 완전한 스크립트는 다음과 같습니다.
DECLARE @dbId int
DECLARE @isStatAsyncOn bit
DECLARE @jobId int
DECLARE @sqlString nvarchar(500)
SELECT @dbId = database_id,
@isStatAsyncOn = is_auto_update_stats_async_on
FROM sys.databases
WHERE name = 'db_name'
IF @isStatAsyncOn = 1
BEGIN
ALTER DATABASE [db_name] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
-- kill running jobs
DECLARE jobsCursor CURSOR FOR
SELECT job_id
FROM sys.dm_exec_background_job_queue
WHERE database_id = @dbId
OPEN jobsCursor
FETCH NEXT FROM jobsCursor INTO @jobId
WHILE @@FETCH_STATUS = 0
BEGIN
set @sqlString = 'KILL STATS JOB ' + STR(@jobId)
EXECUTE sp_executesql @sqlString
FETCH NEXT FROM jobsCursor INTO @jobId
END
CLOSE jobsCursor
DEALLOCATE jobsCursor
END
ALTER DATABASE [db_name] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DROP DATABASE [db_name]
너무 늦은거 알지만 누군가에게 도움이 될지도 몰라.이 기능을 사용하면 데이터베이스를 오프라인으로 전환합니다.
ALTER DATABASE dbname SET OFFLINE
SQL Server 2012에서 hgmnz가 말한 것을 사용해 보았습니다.
관리 기능 생성:
EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'MyDataBase'
GO
USE [master]
GO
/****** Object: Database [MyDataBase] Script Date: 09/09/2014 15:58:46 ******/
DROP DATABASE [MyDataBase]
GO
응용 프로그램에서 삭제하려는 경우 연결 문자열의 초기 카탈로그는 "마스터"여야 합니다.
이하를 참조해 주세요.[확인]을 클릭하지 말고 Ctrl + Shift + N을 누르면 스크립트가 포함된 새 창이 나타납니다.
이 C# 코드를 사용하여 데이터베이스를 삭제합니다.
공용 정적 DropDatabases(문자열 데이터베이스) {
string sql = "ALTER DATABASE " + dataBase + "SET SINGLE_USER WITH ROLLBACK IMMEDIATE" ;
using (System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings["DBRestore"].ConnectionString))
{
connection.Open();
using (System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand(sql, connection))
{
command.CommandType = CommandType.Text;
command.CommandTimeout = 7200;
command.ExecuteNonQuery();
}
sql = "DROP DATABASE " + dataBase;
using (System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand(sql, connection))
{
command.CommandType = CommandType.Text;
command.CommandTimeout = 7200;
command.ExecuteNonQuery();
}
}
}
언급URL : https://stackoverflow.com/questions/1711840/how-do-i-specify-close-existing-connections-in-sql-script
'source' 카테고리의 다른 글
SQL Server에서의 사용자와 로그인의 차이 (0) | 2023.04.07 |
---|---|
서버에 연결할 수 없음 - 네트워크 관련 오류 또는 인스턴스별 오류 (0) | 2023.04.07 |
다중 부품 식별자를 바인딩할 수 없습니다. (0) | 2023.04.07 |
SQL Server에서 외부 키를 작성하려면 어떻게 해야 합니까? (0) | 2023.04.07 |
SQL Server에서 상수 1 또는 0으로 비트 암시 (0) | 2023.04.07 |