programing

모든 테이블을 삭제하고 Azure SQL 데이터베이스를 재설정하는 방법

skycolor 2023. 5. 7. 11:20
반응형

모든 테이블을 삭제하고 Azure SQL 데이터베이스를 재설정하는 방법

ASP를 가지고 있습니다.로컬에서 작동하는 NET MVC 5 프로젝트는 DB를 삭제해야 할 때마다 해당 프로젝트에서 새 쿼리를 열고 사용 가능한 데이터베이스 드롭다운을 마스터로 변경한 다음 로컬 데이터베이스에서 연결을 닫고 "데이터베이스 [이름] 삭제" 쿼리를 실행합니다.그런 다음 프로젝트를 빌드하고 패키지 관리자 콘솔에 들어가 "업데이트-데이터베이스"를 실행합니다.이것은 새로운 로컬 데이터베이스를 재구축하는 것처럼 보이며 내 configuration.cs 파일에서 시드 메서드를 실행합니다.

문제는 API 등을 더 잘 테스트하기 위해 라이브 환경에서 사물을 테스트해야 할 때, 저는 Azure 웹사이트와 함께 제공되는 Azure DB에 배포할 것입니다.게시 마법사에서 "Execute code first migrations"를 선택하지 않고 대부분 작동하며 라이브 버전을 실행하고 디버그할 수 있습니다.때때로 저는 그 DB를 날려버리고 처음부터 다시 시작해야 하지만, 제가 정말로 할 수 있는 유일한 방법은 애저 포털에 들어가서 데이터베이스를 삭제한 다음 같은 이름으로 다시 만드는 것입니다.이 작업은 Azure가 처리하는 데 다소 시간이 걸리기 때문에 테스트 주기가 느립니다.

Azure SQL DB를 삭제/재설정하여 새로움, 비어 있음, 처녀 상태로 만든 다음 "먼저 마이그레이션 코드 실행"을 사용하여 다시 게시하여 테이블을 다시 만들고 데이터를 다시 시드할 수 있는 빠른 방법이 있습니까?

DB를 만든 후 초기 마이그레이션을 생성하고 Powershell을 사용하여 초기 상태로 롤백을 시도하는 것에 대해 몇 가지 이야기를 들었습니다. 하지만 제대로 작동하지 않아서 모든 데이터를 동시에 삭제하고 싶습니다.구문을 잘못 이해했거나 충분한 튜토리얼을 찾지 못한 것 같습니다.Azure DB에서 쿼리를 실행하여 "데이터베이스 [x] 삭제"를 실행할 수 있지만, SQL Azure DB 인스턴스는 예상대로 삭제되므로 다시 포털로 이동하여 다시 생성해야 합니다.모델이 업데이트된 이후로 초기 상태가 좋지 않은 경우가 있으므로 이 방법은 유용하지 않을 수 있습니다.

MS에서 제공하는 모든 훌륭한 도구와 바로 가기가 있기 때문에 실시간 환경에서 변경 사항을 테스트할 수 있는 더 쉬운 방법이 있어야 한다고 생각합니다. 하지만 그들은 이 개발 단계를 위해 여기에 공을 떨어뜨린 것일까요? 아니면 제가 놓친 것일까요?

제가 알고 있는 API 방법이 없기 때문에 이 스크립트를 사용하여 T-SQL 쿼리를 활용하여 데이터베이스를 지웁니다.

각 테이블 삭제(원하는 경우 EF 마이그레이션 기록 유지)

while(exists(select 1 from INFORMATION_SCHEMA.TABLES 
             where TABLE_NAME != '__MigrationHistory' 
             AND TABLE_TYPE = 'BASE TABLE'))
begin
 declare @sql nvarchar(2000)
 SELECT TOP 1 @sql=('DROP TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME
 + ']')
 FROM INFORMATION_SCHEMA.TABLES
 WHERE TABLE_NAME != '__MigrationHistory' AND TABLE_TYPE = 'BASE TABLE'
exec (@sql)
 /* you dont need this line, it just shows what was executed */
 PRINT @sql
end

필요한 경우 외부 키를 먼저 제거하려면 다음과 같이 하십시오.

while(exists(select 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='FOREIGN KEY'))
begin
 declare @sql nvarchar(2000)
 SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME
 + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
 FROM information_schema.table_constraints
 WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
 exec (@sql)
 PRINT @sql
end

제 테스트에서, 이것은 문제 없이 작동했습니다(단, Code First 또는 EF 마이그레이션을 사용하지 않기 때문에 쿼리하는 동안 DROP TABLE에 where 절이 없었다는 점만 제외).

Azure에서 승인된 답변이 제게 효과가 없었기 때문에 답변을 덧붙입니다.아래 스크립트를 사용하여 모든 테이블을 삭제하고 기본적으로 zure 데이터베이스를 재설정합니다.먼저 모든 제약 조건을 삭제한 다음 모든 테이블을 삭제합니다.

@Skorunka Frantishek가 언급했듯이 이 스크립트는 사용자가 기본 [dbo] 스키마를 사용한다고 가정합니다.사용자 고유의 스키마 이름으로 바꿀 수도 있지만,

/* Azure friendly */
/* Drop all Foreign Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)

WHILE @name is not null
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint IS NOT NULL
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint) +']'
        EXEC (@SQL)
        PRINT 'Dropped FK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all Primary Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)

WHILE @name IS NOT NULL
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint is not null
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint)+']'
        EXEC (@SQL)
        PRINT 'Dropped PK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all tables */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Table: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

안타깝게도 이 코드의 소스를 더 이상 찾을 수 없습니다. 저장소 중 하나에 저장했기 때문입니다.누군가에게 도움이 되길 바랍니다.

제 변종을 믹스에 추가하기 위해...또한 보기 및 외부 테이블도 고려합니다.DROP EXTERNAL TABLE과 별도로 제거해야 하는 External Table에는 바핑되지 않습니다.이것은 원래 버전이 영원히 회전하도록 만들었습니다.

while(exists(select 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='FOREIGN KEY'))
begin
 declare @sql nvarchar(2000)
 SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME
 + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
 FROM information_schema.table_constraints
 WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
 exec (@sql)
 PRINT @sql
end


while(exists(select 1 from INFORMATION_SCHEMA.TABLES 
    where TABLE_NAME != 'database_firewall_rules' 
    AND TABLE_TYPE = 'BASE TABLE'
    AND TABLE_NAME NOT IN (select name from sys.external_tables)))
begin
 declare @sql1 nvarchar(2000)
 SELECT TOP 1 @sql1=('DROP TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']')
 FROM INFORMATION_SCHEMA.TABLES
 WHERE TABLE_NAME != 'database_firewall_rules'
    AND TABLE_TYPE = 'BASE TABLE'
    AND TABLE_NAME NOT IN (select name from sys.external_tables)
exec (@sql1)
 PRINT @sql1
end

저는 평소에

  1. SQL Server Management Studio 열기 또는 Visual Studio에서 SQL Server 개체 탐색기 열기
  2. Server Azure SQL 서버)에합니다.yourserver.database.windows.netSQL Server 인증 옵션에 대한 사용자 이름 및 암호를 선택한 경우(또한 이러한 방식으로 PC에서 데이터베이스에 연결하려면 Azure 포털에 방화벽 예외를 추가해야 합니다.)
  3. 데이터베이스를 마우스 오른쪽 단추로 클릭하고 삭제합니다.

그것처럼 간단해.

그런 다음 코드 우선 마이그레이션 접근 방식이 있다고 했으므로 Azure SQL Server에서 마이그레이션을 다시 실행하면 됩니다(예: 게시할 때 지정된 SQL 서버 연결 문자열에 마이그레이션을 적용하는 옵션을 선택해야 함).

보통 원격 데이터베이스를 삭제한 다음 마이그레이션을 다시 실행하는 명령을 사용하여 응용 프로그램을 다시 배포합니다.새 테이블로 데이터베이스를 다시 작성합니다.데이터베이스를 시드할 코드는 내 시작 코드에 있으므로 DB에 값이 없으면 앱이 초기화될 때마다 시드됩니다.

이는 AsNet Core MVC(MVC6)에도 유효합니다.

Azure SQL은 기본적으로 SQL 서버입니다.MS SQL Server Management Studio https://learn.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms 를 사용할 수 있습니다.

관리자 계정을 사용하여 Management Studio에서 데이터베이스를 연 다음, 드롭 테이블 SQL 명령을 실행하거나 GUI 마우스 오른쪽 버튼 메뉴를 사용하여 로컬 데이터베이스를 사용하는 것처럼 원하는 작업을 수행합니다.

Visual Studio SQL Server 개체 탐색기에서도 비슷한 작업을 수행할 수 있습니다.루트 "Add SQL server"를 마우스 오른쪽 버튼으로 클릭합니다.

@Gizmo3399님이 주신 답변에 추가.우리는 시간 테이블을 사용합니다.Entity Framework (EF) Core 5.0.2와 함께.NET 5데이터베이스를 지우는 데 사용하는 명령입니다. History시스템 버전 시간 테이블에 사용하는 스키마입니다.현재 모든 내용을 삭제하려면 두 번 실행해야 하지만 다른 수정은 필요하지 않습니다.

/* Azure friendly */
/* Drop all Foreign Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)
DECLARE @SQL2 VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)

WHILE @name is not null
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint IS NOT NULL
    BEGIN
        IF EXISTS (SELECT * FROM sys.schemas WHERE name = 'History') AND @name != '__EFMigrationsHistory'
            BEGIN
                 SELECT @SQL = 'ALTER TABLE [history].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint) +']'
                 EXEC (@SQL)
            END
        SELECT @SQL2 = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint) +']'
        EXEC (@SQL2)
        PRINT 'Dropped FK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all Primary Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)
DECLARE @SQL2 VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)

WHILE @name IS NOT NULL
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint is not null
    BEGIN
        IF EXISTS (SELECT * FROM sys.schemas WHERE name = 'History') AND @name != '__EFMigrationsHistory'
            BEGIN
                SELECT @SQL = 'ALTER TABLE [history].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint)+']'
                EXEC (@SQL)
            END
        SELECT @SQL2 = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint) +']'
        EXEC (@SQL2)
        PRINT 'Dropped PK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all tables */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)
DECLARE @SQL2 VARCHAR(254)
DECLARE @SQL3 VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    IF EXISTS (SELECT * FROM sys.schemas WHERE name = 'History') AND @name != '__EFMigrationsHistory'
        BEGIN
            SELECT @SQL = ('ALTER TABLE [' + RTRIM(@name) +'] SET (SYSTEM_VERSIONING = OFF)');
            EXEC (@SQL)
            SELECT @SQL2 = 'DROP TABLE [history].[' + RTRIM(@name) +']'
            EXEC (@SQL2)
        END
    SELECT @SQL3 = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL3)
    PRINT 'Dropped Table: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

IF EXISTS (SELECT * FROM sys.schemas WHERE name = 'History')
BEGIN
    DROP SCHEMA History
END

GO

만약 누군가가 이러한 스크립트를 갖고 싶지만 스키마별로 필터를 사용한다면 다음과 같습니다.

/* Azure friendly */

/* Drop all Foreign Key constraints */

/* Arguments */
DECLARE @schema VARCHAR(128) = '<TODO_PROVIDE_SCHEMA>'


/* Variables */
DECLARE @tableName VARCHAR(128)
DECLARE @tableSchema VARCHAR(128)
DECLARE @constraintName VARCHAR(254)
DECLARE @SQL VARCHAR(254)


SELECT TOP 1
   @tableName = sourceTable.name,
   @tableSchema = SCHEMA_NAME(sourceTable.schema_id),
   @constraintName = f.name
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id
INNER JOIN sys.tables targetTable ON targetTable.OBJECT_ID = fc.referenced_object_id
INNER JOIN sys.tables sourceTable ON f.parent_object_id = sourceTable.object_id
WHERE targetTable.[schema_id] = SCHEMA_ID(@schema)
ORDER BY sourceTable.name

WHILE @tableName is not null
BEGIN

    SELECT @SQL = 'ALTER TABLE [' + RTRIM(@tableSchema) + '].[' + RTRIM(@tableName) +'] DROP CONSTRAINT [' + RTRIM(@constraintName) +']'
    EXEC (@SQL)
    PRINT 'Executed: ' + @SQL
    
    SET @tableName = NULL;

    SELECT TOP 1
       @tableName = sourceTable.name,
       @tableSchema = SCHEMA_NAME(sourceTable.schema_id),
       @constraintName = f.name
    FROM sys.foreign_keys AS f
    INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id
    INNER JOIN sys.tables targetTable ON targetTable.OBJECT_ID = fc.referenced_object_id
    INNER JOIN sys.tables sourceTable ON f.parent_object_id = sourceTable.object_id
    WHERE targetTable.[schema_id] = SCHEMA_ID(@schema)
    ORDER BY sourceTable.name
END
GO
/* Drop all Primary Key constraints */

DECLARE @schema VARCHAR(128) = '<TODO_PROVIDE_SCHEMA>'

DECLARE @tableName VARCHAR(128)
DECLARE @tableSchema VARCHAR(128)
DECLARE @constraintName VARCHAR(254)
DECLARE @constraintSchema VARCHAR(128)
DECLARE @SQL VARCHAR(254)


SELECT 
    @tableName = t.name,
    @tableSchema = SCHEMA_NAME(t.schema_id),
    @constraintName = pk.name,
    @constraintSchema = SCHEMA_NAME(t.schema_id)
FROM sys.objects pk 
JOIN sys.objects t ON (pk.parent_object_id = t.object_id)
WHERE pk.[type] = 'PK'
    AND pk.schema_id = SCHEMA_ID(@schema)
ORDER BY t.name 

WHILE @tableName is not null
BEGIN
    SELECT @SQL = 'ALTER TABLE [' + RTRIM(@tableSchema) + '].[' + RTRIM(@tableName) +'] DROP CONSTRAINT [' + RTRIM(@constraintName) +']'
    PRINT 'Executing: ' + @SQL
    EXEC (@SQL)

    SET @tableName = null;
    SELECT 
        @tableName = t.name,
        @tableSchema = SCHEMA_NAME(t.schema_id),
        @constraintName = pk.name,
        @constraintSchema = SCHEMA_NAME(t.schema_id)
    FROM sys.objects pk 
    JOIN sys.objects t ON (pk.parent_object_id = t.object_id)
    WHERE pk.[type] = 'PK'
        AND pk.schema_id = SCHEMA_ID(@schema)
    ORDER BY t.name 
END
GO



/* Drop all tables */

DECLARE @schema VARCHAR(128) = '<TODO_PROVIDE_SCHEMA>'

DECLARE @tableName VARCHAR(128)
DECLARE @tableSchema VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT TOP 1 
    @tableName = [name],
    @tableSchema = SCHEMA_NAME(schema_id)
FROM sys.tables
WHERE [type] = 'U' 
    AND schema_id = SCHEMA_ID(@schema)

WHILE @tableName IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP TABLE [' + RTRIM(@tableSchema) +'].[' + RTRIM(@tableName) +']'
    EXEC (@SQL)
    PRINT 'Dropped Table: ' + @tableName

    SET @tableName = NULL;
    SELECT TOP 1 
        @tableName = [name],
        @tableSchema = SCHEMA_NAME(schema_id)
    FROM sys.tables
    WHERE [type] = 'U' 
        AND schema_id = SCHEMA_ID(@schema)
END
GO


/* DROP Sequences */

DECLARE @schema VARCHAR(128) = '<TODO_PROVIDE_SCHEMA>'


DECLARE @seqName VARCHAR(128)
DECLARE @seqSchema VARCHAR(128)
DECLARE @SQL VARCHAR(254)


SELECT TOP 1
    @seqName = s.name,
    @seqSchema = SCHEMA_NAME(s.schema_id)
FROM sys.sequences s
WHERE schema_id = SCHEMA_ID(@schema)
ORDER BY s.name


WHILE @seqName is not null
BEGIN
    SELECT @SQL = 'DROP SEQUENCE [' + RTRIM(@seqSchema) + '].[' + RTRIM(@seqName) +']'
    PRINT 'Executing: ' + @SQL
    EXEC (@SQL)

    SET @seqName = null
    SELECT TOP 1
        @seqName = s.name,
        @seqSchema = SCHEMA_NAME(s.schema_id)
    FROM sys.sequences s
    WHERE schema_id = SCHEMA_ID(@schema)
    ORDER BY s.name
END
GO

실행하기 전에 변경해야 합니다.<TODO_PROVIDE_SCHEMA>스키마에

이 스크립트는 대상 스키마와 관련된 모든 FK를 찾습니다. 예를 들어, 다음과 같은 경우schema1.table1FK가 있음schema2.table2그리고 우리가 삭제하고 싶다면,schema2그러면 내 스크립트도 해당 FK를 삭제합니다(다른 스키마일지라도).

스크립트는 시퀀스도 삭제합니다.

이 일을 우연히 마주치는 사람을 위해서요이렇게 하면 모든 구속조건이 삭제되고 뷰가 삭제된 다음 표가 삭제됩니다.

/* Azure friendly */
/* Drop all Foreign Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)

WHILE @name is not null
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint IS NOT NULL
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint) +']'
        EXEC (@SQL)
        PRINT 'Dropped FK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all Primary Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)

WHILE @name IS NOT NULL
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint is not null
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint)+']'
        EXEC (@SQL)
        PRINT 'Dropped PK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop All Views */
while(exists(select 1 from INFORMATION_SCHEMA.VIEWS 
    where TABLE_NAME != 'database_firewall_rules' 
    AND TABLE_NAME NOT IN (select name from sys.external_tables)))
begin
 declare @sql1 nvarchar(2000)
 SELECT TOP 1 @sql1=('DROP VIEW ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']')
 FROM INFORMATION_SCHEMA.VIEWS
 WHERE TABLE_NAME != 'database_firewall_rules'
    AND TABLE_NAME NOT IN (select name from sys.external_tables)
exec (@sql1)
 PRINT @sql1
end

/* Drop all tables */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Table: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

또는 C#에서 데이터베이스를 삭제하고 ExecuteNonQuery를 사용하여 새 데이터베이스를 생성할 수 있습니다.

queryString = "DROP DATABASE TestDB2";

SqlCommand command = new SqlCommand(queryString, connection);
        command.Connection.Open();
        command.ExecuteNonQuery();

여기서 연결은 Azure SQL 데이터베이스 마스터 데이터베이스에 대한 연결입니다.

또는 데이터베이스를 작성하려면 다음을 수행합니다.

queryString = "CREATE DATABASE TestDB2 ( EDITION = 'standard' )";

언급URL : https://stackoverflow.com/questions/34967878/how-to-drop-all-tables-and-reset-an-azure-sql-database

반응형