2011-02-02 19 views
6

Veritabanı üzerinde yazma girişimi olup olmadığını doğrulamak için gerçek sorguyu yürütmeden önce bir SQLite veritabanı kullanıp EXPLAIN ifadesi çalıştırdım.SQL Server'da EXPLAIN form SQLite eşdeğeri nedir?

Şimdi, SQL Server'a geçiş yaptık ve bir sorgu veritabanında yazmayı denediğinde veya yalnızca basit bir SELECT ifadesi olup olmadığını bilmem gerekiyor. Temelde herhangi bir kötü niyetli beyandan kaçınmaya çalışıyorum.

+4

Sorguyu, herhangi bir DML/DDL izinleri olmayan bir kullanıcı/rol/uygulama rolüyle neden çalıştırmıyorsunuz? –

+0

Gerçekten de; Damien'ın dediği gibi, SQL Server ile gitmenin yolu basitçe veritabanına yazamayan bir kullanıcı oluşturmak ve bunu kullanmaktır. Sorgu planlarını analiz ederek akıllıca şeyler yapmaya çalışmak, çok karmaşık ve problemlere karşı eğilimli. –

cevap

8

Tahmini sorgu planı düğmesini tıklatarak SSMS'deki herhangi bir sorgunun tahmini sorgu planını görebilirsiniz.

Bkz. MSDN. Kullanıcı, veritabanına yazmamalıysa, bunun için izinlere sahip olmamalıdır. Bununla birlikte, kullanıcı veritabanına yazmamalıysa, bunun için gerekli izinlerin olmaması gerekir. Kısıtlı izinlere sahip bir role ait olduğundan emin olun. Bu yolu gitmeye karar verirseniz

3

, aşağıdakileri yapabilirsiniz:

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

Bu XML tek bir sütun içeren 3 sonuç kümelerini dönecektir. 2. sonuç kümesi, gerçek sorgu için sorgu planı (bu durumda, select * from sysobjects)

Ancak, yorumuma not ettiğim gibi, kullanıcının herhangi bir değişiklik yapma iznine sahip olmasını engellemek daha iyi olur.

Ayrıca "yalnızca" olan ancak aynı zamanda oldukça kötü niyetli olan ifadeler oluşturmak da mümkündür. Kolayca veritabanındaki her tabloyu kilitleyen ve çalıştırmak için bir saat alan bir seçim yazabilirim.

+0

GUI'den daha iyi bir yoldur, çünkü nedense uzak sunucuda sorguları yürütürsünüz! –

İlgili konular