2015-04-24 14 views
9

Tôi đang thực hiện một số quản trị viên DB với cơ sở dữ liệu Azure và tôi cần thực hiện các truy vấn như loại bỏ tất cả các ràng buộc trong cơ sở dữ liệu.SQL Xóa tất cả các ràng buộc Azure thân thiện

sp_MSForEachTable không khả dụng khi làm việc với cơ sở dữ liệu Azure, vì vậy tôi đang làm việc theo một cách khác để thực hiện.

Tôi tìm thấy một đoạn mã mà giọt tất cả các bảng ở đây: http://edspencer.me.uk/2013/02/25/drop-all-tables-in-a-sql-server-database-azure-friendly/ và cố gắng sửa đổi nó để loại bỏ tất cả các hạn chế như tôi cần phải và đã đưa ra kết quả này:

while(exists(select 1 from INFORMATION_SCHEMA.TABLES where TABLE_NAME != '__MigrationHistory')) 
begin 
    PRINT ('Disabling' + TABLE_NAME) 
    declare @constraintOff nvarchar(2000) 
    SELECT TOP 1 @constraintOff=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] ' + 'NOCHECK CONSTRAINT all') 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_NAME != '__MigrationHistory' 
    exec (@constraintOff) 
    PRINT @constraintOff 
end 

Nó liên tục cố gắng để vận hành vào mục đầu tiên trong cơ sở dữ liệu, mà sẽ làm việc tốt nếu bạn đã bỏ tất cả mọi thứ nhưng tôi cần phải lặp qua mỗi bảng và vô hiệu hóa ràng buộc của nó như sp_MSForEachTable nào.

Bất kỳ mẹo nào? Tôi đã nhìn thấy một vài điều ở đây và ở đó yêu cầu bồi thường để làm điều này, nhưng chúng thường là hai hoặc ba trang dài kịch bản mà làm rất nhiều thứ khác và họ làm cho bộ não của tôi bị tổn thương.

CẬP NHẬT

vẫn làm việc trên truy vấn đó, nó có vẻ như một cái gì đó để chấm dứt điều này có thể làm việc tốt hơn nhưng vẫn không có con xúc xắc:

declare @constraintOff nvarchar(2000) 
SELECT @constraintOff=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] ' + 'NOCHECK CONSTRAINT all') 
FROM INFORMATION_SCHEMA.TABLES 
exec (@constraintOff) 
PRINT @constraintOff 

Cái này vẫn chỉ hoạt động trên một bảng, nhưng ít nhất nó không phải là một vòng lặp vô hạn :)

+1

Tôi biết điều này là dành cho Amazon RDS, nhưng có một phần về việc vô hiệu hóa các ràng buộc: http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/SQLServer.Procedural.Importing.html có thể hữu ích. – Nate

+1

đó là chính xác những gì bác sĩ đã ra lệnh, có các đoạn cụ thể để thêm và loại bỏ tất cả các ràng buộc, nếu bạn đặt những liên kết đó vào một bài đăng, tôi sẽ đánh dấu câu trả lời là – Eric

Trả lời

6

Trong khi liên kết này là dành cho Amazon RDS, nó cung cấp mã cụ thể để vô hiệu hóa các ràng buộc mà không sp_MSForEachTable

Importing and Exporting SQL Server Data

-- Manually specify database name - a safeguard in case you paste this into the wrong SSMS window. 
USE [staging] 

-- Change this line if you want to enable (1) or disable constraints: 
DECLARE @enable_constraints bit = 0 

--Don't change anything below this line. 
DECLARE @schema_name SYSNAME 
DECLARE @table_name SYSNAME 

DECLARE table_cursor CURSOR FOR 
SELECT 
    schemas.name, 
    tables.name 
FROM 
    sys.tables 
    INNER JOIN sys.schemas ON tables.schema_id = schemas.schema_id 

OPEN table_cursor 
FETCH NEXT FROM table_cursor INTO @schema_name, @table_name 

DECLARE @cmd varchar(200) 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @cmd = 'ALTER TABLE ' + QUOTENAME(@schema_name) + '.' + QUOTENAME(@table_name) + ' ' 
    SET @cmd = @cmd + (CASE WHEN @enable_constraints = 1 THEN 'CHECK' ELSE 'NOCHECK' END) + ' CONSTRAINT ALL' 

    PRINT @cmd 
    EXEC(@cmd) 

    FETCH NEXT FROM table_cursor INTO @schema_name, @table_name 
END 

CLOSE table_cursor 
DEALLOCATE table_cursor 
+4

Để tắt nó phải là 'SELECT @cmd = 'ALTER TABLE' + QUOTENAME (@table_name) + 'KHÔNG CÓ KIỂM TRA TÌM KIẾM TẤT CẢ'; ' Và để kích hoạt lại nó phải là: 'SELECT @cmd =' ALTER TABLE '+ QUOTENAME (@table_name) +' VỚI KIỂM TRA KIỂM TRA KIỂM TRA TẤT CẢ ';' – tumtumtum

+1

Thực sự hiệu chỉnh. Mã vô hiệu hóa không cần "WITH". Việc kích hoạt lại không. – tumtumtum

+0

KHÔNG KIỂM TRA phải là một từ: 'SELECT @cmd = 'ALTER TABLE' + QUOTENAME (@table_name) + 'KHÔNG CÓ KIỂM TRA TẤT CẢ'; ' – AndyMcKenna

2

mở rộng kịch bản để đối phó với các bảng trong lược đồ khác nhau, cũng sửa lại kịch bản ở trên mà không được vô hiệu hóa kiểm tra:

-- DISABLE ALL CONSTRAINTS 
DECLARE @table_name SYSNAME; 
DECLARE @schema_name SYSNAME; 
DECLARE @cmd NVARCHAR(MAX); 
DECLARE table_cursor CURSOR FOR 
    SELECT s.name, t.name 
    FROM sys.tables t 
    join sys.schemas s on t.schema_id = s.schema_id 

OPEN table_cursor; 
FETCH NEXT FROM table_cursor INTO @schema_name, @table_name; 

WHILE @@FETCH_STATUS = 0 BEGIN 
    SELECT @cmd = 'ALTER TABLE '+QUOTENAME(@schema_name)+'.'+QUOTENAME(@table_name)+' NOCHECK CONSTRAINT ALL'; 
    EXEC (@cmd); 
    FETCH NEXT FROM table_cursor INTO @schema_name, @table_name; 
END 

CLOSE table_cursor; 
DEALLOCATE table_cursor; 


-- enable all constraints 
DECLARE table_cursor CURSOR FOR 
    SELECT s.name, t.name 
    FROM sys.tables t 
    join sys.schemas s on t.schema_id = s.schema_id 

OPEN table_cursor; 
FETCH NEXT FROM table_cursor INTO @schema_name, @table_name; 

WHILE @@FETCH_STATUS = 0 BEGIN 
    SELECT @cmd = 'ALTER TABLE '+QUOTENAME(@schema_name)+'.'+QUOTENAME(@table_name)+' CHECK CONSTRAINT ALL'; 
    EXEC (@cmd); 
    FETCH NEXT FROM table_cursor INTO @schema_name, @table_name; 
END 

CLOSE table_cursor; 
DEALLOCATE table_cursor; 
Các vấn đề liên quan