2009-04-03 36 views
12

Các phương pháp hay nhất để đảm bảo rằng SQL của bạn có thể chạy nhiều lần mà không nhận được lỗi trên các lần chạy tiếp theo là gì?Các kịch bản SQL Server có thể chạy lại

ví dụ:

  • kiểm tra rằng các bảng không đã tồn tại trước khi tạo chúng
  • kiểm tra xem cột không đã tồn tại trước khi tạo hoặc đổi tên
  • giao dịch với rollback về lỗi
  • Nếu bạn thả bảng mà tồn tại trước tạo ra chúng một lần nữa, thả phụ thuộc của họ trước, và đừng quên tạo lại chúng sau
  • Sử dụng CREATE OR ALTER PROCEDURE thay vì CREATE PROCEDURE hoặc ALTER PROCEDURE nếu hương vị của SQL của bạn hỗ trợ nó
  • Duy trì một lược đồ phiên bản nội bộ, vì vậy cùng một SQL không chạy hai lần ngay từ đầu. Bằng cách này, bạn luôn biết mình đang ở đâu bằng cách xem số phiên bản.
  • Xuất dữ liệu hiện có sang câu lệnh INSERT và hoàn toàn tạo lại toàn bộ DB từ đầu.

  • thả bảng trước khi tạo chúng (không phải là điều an toàn nhất bao giờ hết, nhưng sẽ làm việc trong một pinch nếu bạn biết những gì bạn đang làm)

chỉnh sửa: tôi đang tìm kiếm một cái gì đó như thế này:

IF EXISTS (SELECT * 
      FROM sys.objects 
      WHERE object_id = OBJECT_ID(N'[dbo].[foo]') 
        AND OBJECTPROPERTY(object_id, N'IsUserTable') = 1) 
DROP TABLE foo 

Người khác có sử dụng câu như thế này hay cái gì tốt hơn không?

chỉnh sửa: Tôi thích gợi ý Jhonny của:

IF OBJECT_ID('table_name') IS NOT NULL DROP TABLE table_name 

tôi làm điều này cho cột thêm:

IF NOT EXISTS (SELECT * 
       FROM SYSCOLUMNS sc 
       WHERE EXISTS (SELECT id 
           FROM [dbo].[sysobjects] 
           WHERE NAME LIKE 'TableName' 
             AND sc.id = id) 
         AND sc.name = 'ColumnName') 
    ALTER TABLE [dbo].[TableName] ADD [ColumnName] 
+0

tôi muốn loại bỏ rơi bảng trước khi tạo ra chúng. Bạn sẽ không muốn thả bảng với dữ liệu! –

+0

Đồng ý, nó có lẽ không phải là điều an toàn nhất để làm. Tôi chỉ cố gắng để có được quả bóng lăn trên các loại phản ứng tôi đang tìm kiếm. –

Trả lời

0

Đối với việc duy trì schemas, nhìn vào một công cụ chuyển đổi. Tôi nghĩ LiquiBase sẽ làm việc cho SQL Server.

4

Để thêm vào danh sách của bạn:

  • Nếu bạn thả bảng mà tồn tại trước khi tạo cho họ một lần nữa, thả phụ thuộc của họ đầu tiên quá, và đừng quên để tái tạo chúng sau khi
  • Sử dụng CREATE OR ALTER PROCEDURE thay vì CREATE PROCEDURE hoặc ALTER PROCEDURE nếu hương vị của bạn của SQL hỗ trợ nó

Nhưng cuối cùng, tôi sẽ đi với một trong các cách sau:

  • Duy trì một lược đồ phiên bản nội bộ, vì vậy cùng một SQL chỉ không chạy hai lần ngay từ đầu. Bằng cách này, bạn luôn biết mình đang ở đâu bằng cách xem số phiên bản.
  • Xuất dữ liệu hiện có thành INSERT câu lệnh và hoàn toàn tạo lại toàn bộ DB từ đầu.
+0

Mẹo hay, với lược đồ phiên bản nội bộ – SQueek

0

Bạn cũng sẽ cần phải kiểm tra các khóa ngoại trên bất kỳ bảng nào mà bạn có thể đang giảm/tạo lại. Ngoài ra, hãy xem xét mọi thay đổi dữ liệu mà bạn có thể thực hiện - xóa các hàng trước khi thử chèn lần thứ hai, v.v.

Bạn cũng có thể đặt mã để kiểm tra dữ liệu trước khi xóa bảng dưới dạng bảo vệ để bạn không ' t thả các bảng đã được sử dụng.

5

Tôi nghĩ rằng thực tế quan trọng nhất trong việc đảm bảo rằng tập lệnh của bạn có thể chạy lại là ... chạy chúng trên cơ sở dữ liệu thử nghiệm nhiều lần sau khi có bất kỳ thay đổi nào đối với tập lệnh. Các lỗi bạn gặp phải sẽ định hình các thực tiễn của bạn.

EDIT

Để đối phó với chỉnh sửa của bạn về cú pháp, nói chung tôi nghĩ rằng nó là tốt nhất để tránh các bảng hệ thống ủng hộ các quan điểm hệ thống ví dụ

if exists(Select 1 from information_schema.tables where table_name = 'sometable') 
    drop sometable 
go 
if exists(Select 1 from information_schema.routines where 
specific_name = 'someproc') 
    drop someproc 
0

Đối với một câu lệnh SQL hàng loạt, bạn có thể phát hành

Đây chỉ là một FYI, tôi chỉ cần chạy nó 10 lần

IF EXISTS (SELECT * 
      FROM sys.objects 
      WHERE object_id = OBJECT_ID(N'[dbo].[foo]') 
        AND OBJECTPROPERTY(object_id, N'IsUserTable') = 1) 
DROP TABLE foo 


GO 10 -- run the batch 10 times 

Đây chỉ là một FYI, tôi chỉ cần chạy nó 10 lần

Bắt đầu vòng lặp thực hiện hàng loạt

thực hiện hoàn thành 10 lần.

3

thời gian gần đây tôi tìm thấy một check-in cho sự tồn tại mà tôi không biết tồn tại và tôi thích nó vì nó ngắn

IF OBJECT_ID('table_name') IS NOT NULL DROP TABLE table_name 

trước đây, tôi sử dụng để sử dụng

IF EXISTS (SELECT * FROM information_schema.tables WHERE table_name = 'table_name') 
DROP TABLE table_name 

nào tôi thấy hữu ích vì nó di động hơn một chút (MySql, Postgres, v.v.), có tính đến sự khác biệt, tất nhiên là

3

Để làm mọi thứ dễ dàng hơn IER tôi cấu hình quản lý studio kịch bản các đối tượng như rerunnable

  1. cụ
  2. Tùy chọn
  3. SQL Server Object Explorer
  4. Scripting
  5. tùy chọn Object scripting
  6. Bao gồm NẾU Không Tồn tại khoản Đúng
0

Cú pháp "NẾU OBJECT_ID ('tên_bảng', 'U') KHÔNG CÓ NULL" là tốt, nó cũng có thể được sử dụng cho các thủ tục: NẾU OBJECT_ID ('procname', 'P') KHÔNG PHẢI là NULL ...

... và trình kích hoạt, chế độ xem, v.v ... Có thể thực hành tốt để chỉ định loại (U cho bảng, P cho prog, v.v.không nhớ chính xác các chữ cái cho tất cả các loại) trong trường hợp các tên gọi của bạn cho phép các thủ tục và bảng có tên tương tự ...

Hơn nữa, một ý tưởng hay là tạo các thủ tục của riêng bạn môi trường của bạn. Ví dụ:

  • prcTableDrop, Proc cho droping một bảng
  • prcTableColumnAdd, Proc để thêm một cột vào một bảng
  • prcTableColumnRename, bạn sẽ có được ý tưởng
  • prcTableIndexCreate

như vậy procs làm cho việc tạo các kịch bản thay đổi lặp lại (cùng một hoặc khác) dễ dàng hơn nhiều.

/B

Các vấn đề liên quan