2011-02-02 34 views
6

Tôi đã sử dụng cơ sở dữ liệu SQLite và chạy câu lệnh EXPLAIN trước khi thực hiện truy vấn thực tế để xác minh xem có bất kỳ nỗ lực nào để viết trên cơ sở dữ liệu hay không.tương đương với EXPLAIN dạng SQLite trong SQL Server là gì?

Bây giờ, chúng tôi đã di chuyển sang SQL Server và tôi cần phải biết nếu truy vấn cố gắng viết trên cơ sở dữ liệu hoặc chỉ là một câu lệnh SELECT đơn giản. Tôi về cơ bản cố gắng tránh bất kỳ tuyên bố độc hại nào.

+4

Bất kỳ lý do nào khiến bạn không chỉ chạy truy vấn với vai trò người dùng/vai trò/ứng dụng không có bất kỳ quyền DML/DDL nào? –

+0

Thật vậy; như Damien nói, với SQL Server con đường để đi là chỉ đơn giản là tạo ra một người dùng mà không thể ghi vào cơ sở dữ liệu, và sử dụng đó. Cố gắng làm những điều thông minh với việc phân tích các kế hoạch truy vấn là cực kỳ phức tạp và dễ bị vấn đề khi so sánh. –

Trả lời

8

Bạn có thể xem gói truy vấn ước tính của bất kỳ truy vấn nào trong SSMS bằng cách nhấp vào nút kế hoạch truy vấn ước tính.

Xem MSDN.


Tuy nhiên, nếu người dùng không được ghi vào cơ sở dữ liệu, không được phép làm như vậy. Đảm bảo nó thuộc về vai trò có quyền hạn chế.

3

Nếu bạn quyết định đi tuyến đường này, bạn có thể làm như sau:

set showplan_xml on 
go 
set noexec on 
go 
select * from sysobjects 
go 
set noexec off 
go 
set showplan_xml off 
go 

này sẽ trở lại 3 bộ kết quả có chứa một cột duy nhất của XML. Tập kết quả thứ hai là kế hoạch truy vấn cho truy vấn thực tế (trong trường hợp này là select * from sysobjects)

Nhưng như đã lưu ý trong nhận xét của tôi, bạn nên ngăn người dùng có quyền thực hiện bất kỳ thay đổi nào.

Cũng có thể tạo các câu lệnh chỉ "chọn" nhưng cũng khá độc hại. Tôi có thể dễ dàng viết một lựa chọn độc quyền khóa tất cả các bảng trong cơ sở dữ liệu và mất một giờ để chạy.

+0

Đó là một cách tốt hơn so với GUI nếu vì một số lý do bạn chỉ có thể thực hiện các truy vấn trên máy chủ từ xa! –

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