2009-07-09 29 views
8

Tôi đang viết một tập lệnh cài đặt để cài đặt tất cả các bảng, thủ tục lưu trữ, dạng xem, chỉ mục văn bản đầy đủ, người dùng vv.Cơ sở dữ liệu SQL hoàn toàn trống

Tất cả đều hoạt động tốt nếu người dùng có tất cả các quyền chính xác và tập lệnh chạy từ đầu đến cuối. Tuy nhiên, nếu kịch bản chết ở đâu đó giữa chừng thì nó không thể chạy lại được nữa.

Để thực hiện điều này, tôi muốn cơ bản trả lại cơ sở dữ liệu về trạng thái "hoàn toàn mới" ở nơi không có gì.

Tôi nhận ra cách xóa từng bảng/sp/view .. theo cách riêng của chúng nhưng tôi đang tìm cách tổng quát hơn để đặt lại cơ sở dữ liệu.

Tôi cũng cần có thể xóa Danh mục và người dùng Fulltext.

Cảm ơn bạn đã được trợ giúp.

Chạy SQL Server 2005

Trả lời

6

Âm thanh như một công việc cho Drop Database:

-- SQL Server Syntax 
DROP DATABASE [ IF EXISTS ] { database_name | database_snapshot_name } [ ,...n ] [;] 
+0

Tôi sẽ đi theo cách này vì một vài lý do. 1. Bạn yên tâm rằng không có dữ liệu "cũ" trong cơ sở dữ liệu. 2. Nó giữ mô hình dev/testing của bạn trung thực bằng cách yêu cầu cơ sở dữ liệu được xây dựng từ đầu. Nếu bạn thêm các bảng mới, các khung nhìn, các thủ tục, vv .. nó phải là một phần của chu trình triển khai/cài đặt/thử nghiệm. Không triển khai một cơ sở dữ liệu, triển khai các phương tiện để tạo ra nó. –

+0

Đồng ý. Bạn đang tạo * cơ sở dữ liệu, không duy trì cơ sở dữ liệu hiện tại; nếu bạn không thể tạo chính xác theo cách bạn muốn, bạn có thể chỉ cần thả và thử lại. –

7

Bạn có thể chạy toàn bộ kịch bản trong một giao dịch và sau đó gọi một rollback nếu nó không thành công?

TẠO TẠO có thể được cuộn lại dễ dàng như INSERT/UPDATE.

+0

đó là tất nhiên con đường để đi, nevermind trả lời của tôi =) –

+0

@d. Tôi không chắc tại sao nó lại là beter. Đó là cho phép người dùng hoặc có lý do khác? – Jonathan

+0

Tôi đồng ý .. nếu một cơ sở dữ liệu thả/tạo là một lựa chọn, bạn có thể dễ dàng thực hiện điều đó. –

2

Nhãn hiệu mới có chứa gì? Thả cơ sở dữ liệu và tạo lại nó nếu bạn có quyền làm điều này.

-1

Bạn có thể chạy toàn bộ tập lệnh trong một giao dịch, vì vậy bạn có thể khôi phục tập lệnh tại bất kỳ thời điểm nào.

Tùy chọn thứ hai - trước khi cài đặt luôn tạo bản sao lưu. Nếu không thành công, hãy khôi phục cơ sở dữ liệu từ bản sao lưu

0

Tôi không chắc đây có phải là thứ bạn đang tìm kiếm không, nhưng đối với từng đối tượng, bạn có thể kiểm tra nếu tồn tại trước khi tạo. Sau đó, bạn có thể chạy lại tập lệnh nếu nó không hoạt động ở giữa.

IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(@Object) AND type = (@Type)) 

...

0

Nếu bạn đã trình kịch bản của bạn tự động mỗi đối tượng, bạn sẽ có thể quấn toàn bộ quá trình trong một giao dịch và cung cấp xử lý lỗi cho mỗi Statment DDL. Điều này cũng hoạt động tốt khi áp dụng các bản cập nhật lược đồ. Xin lưu ý, điều này được dựa trên các kịch bản nâng cấp mà Red-Gate SQL Compare tạo ra.

Tiêu đề:

SET NUMERIC_ROUNDABORT OFF 
GO 
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON 
GO 
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE id=OBJECT_ID('tempdb..#tmpErrors')) DROP TABLE #tmpErrors 
GO 
CREATE TABLE #tmpErrors (Error int) 
GO 
SET XACT_ABORT ON 
GO 
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 
GO 
BEGIN TRANSACTION 
GO 

Footer:

IF EXISTS (SELECT * FROM #tmpErrors) ROLLBACK TRANSACTION 
GO 
IF @@TRANCOUNT>0 BEGIN 
    PRINT 'Script succeeded' 
    COMMIT TRANSACTION 
END 
ELSE BEGIN 
    PRINT 'Script failed' 
END 
GO 
DROP TABLE #tmpErrors 

Wrapper (Đối với mỗi đối tượng cơ sở dữ liệu):

/* Insert Data Definition here then append with...*/ 
GO 
IF @@ERROR<>0 AND @@TRANCOUNT>0 ROLLBACK TRANSACTION 
GO 
IF @@TRANCOUNT=0 BEGIN INSERT INTO #tmpErrors (Error) SELECT 1 BEGIN TRANSACTION END 
GO 
0

Red G ate của SQL So sánh sẽ làm điều đó cho bạn, nó là một công cụ tuyệt vời.

-1

Drop và tạo DB:

use master 
IF EXISTS(select * from sys.databases where name='YourDBName') 
DROP DATABASE YourDBName 
CREATE database YourDBName 
Các vấn đề liên quan