Izin EXECUTE ditolak pada tipe tabel yang ditentukan pengguna?

88

Saya memiliki pertanyaan tentang Jenis Tabel yang Ditentukan Pengguna di SQL Server 2008.

Untuk kebutuhan salah satu aplikasi ASP.NET, kami menetapkan jenis tabel kami sendiri di SQL Server 2008 untuk menggunakannya sebagai parameter dalam prosedur tersimpan (saat menjalankan perintah sql di aplikasi ASP.NET, kami meneruskan objek DataTable sebagai parameter untuk prosedur tersimpan lihat di sini untuk contoh )

Masalahnya adalah ketika kita menjalankan perintah Sql (menjalankan prosedur yang tersimpan) dari ASP.NET kita mendapatkan kesalahan:

Izin EXECUTE ditolak pada objek 'ourTableType', database 'ourDatabase', skema 'ourSchema'.

Mengapa demikian? Mengapa kita perlu mengatur izin pada tipe tabel yang ditentukan pengguna? Mengapa tidak cukup hanya mengatur izin pada prosedur tersimpan yang menggunakannya? Dan jika kita harus mengaturnya tidak peduli apa, mengapa tidak ada EXECUTEjenis izin untuk set di jendela properti apapun (saya hanya dapat melihat Control, References, Take Ownership, View Definition)?

Yang juga tidak saya mengerti adalah bahwa mengatur izin ke Controldalam jendela properti memecahkan masalah dan prosedur tersimpan berjalan tanpa masalah.

Janez
sumber
Terima kasih! Saya sudah mencari tapi jelas tidak cukup baik: /
Janez
Coba letakkan AS dbodi bagian akhir. Seperti ini: GRANT EXEC ON TYPE::[schema].[typename] TO [User] AS dbo. Bekerja untuk saya.
Jonathan

Jawaban:

201

Saya sangat berharap Anda telah menyelesaikan ini sekarang, mengingat pertanyaannya sudah hampir 4 bulan, tetapi jika Anda belum melakukannya, inilah yang menurut saya adalah jawabannya.

GRANT EXEC ON TYPE::[schema].[typename] TO [User]
GO
mccow002.dll
sumber
9
2 sen saya: Tergantung pada mekanisme otentikasi koneksi Anda, Anda mungkin harus memberikan exec ke grup Publik. Jadi hibah Anda akan terlihat seperti ini: GRANT EXEC ON TYPE :: [schema]. [Typename] TO [Public] GO
Sudhanshu Mishra
@dotnetguy terima kasih banyak, tidak ada solusi yang berhasil untuk saya kecuali solusi Anda.
Mazen el Senih
3

Jika prosedur tersimpan Anda menggunakan sql dinamis, yang berarti @sqldihasilkan dan kemudian dieksekusi melalui exec @sql, Anda memerlukan izin yang diberikan pada tabel yang mendasarinya.

Salah satu solusinya adalah mengubah prosedur tersimpan untuk dijalankan sebagai pengguna yang berbeda . Jika Anda membuatnya berjalan sebagai SELF, itu akan dijalankan di bawah pembuat proc yang disimpan, yang sangat berbahaya. Namun, jika Anda tidak memiliki pilihan lain:

CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS SELF
rkw
sumber
1
Terima kasih telah menunjukkan hal ini. Tetapi prosedur yang tersimpan tidak memiliki sql dinamis di dalamnya. Hanya INSERT INTOpernyataan tabel umum dan 'UPDATE' dimana pengguna ini memiliki semua izin yang dia butuhkan. Juga pengguna / login ini secara khusus dicadangkan / dibuat untuk aplikasi ASP.NET ini agar dapat terhubung ke database ini dan hanya menjalankan prosedur yang tersimpan (tidak membuat dll, pembuat selalu 'sa').
Janez
Terima kasih, itulah masalahnya bagi saya. Pembaca lain yang mengalami masalah ini dapat merujuk ke Izin SQL Server pada Penyimpanan Procs dengan SQL dinamis untuk mendapatkan tip selengkapnya.
Nickolay