Bagaimana Anda memberikan izin eksekusi untuk satu prosedur tersimpan?


40

Biasanya ketika saya membuat prosedur tersimpan saya menggunakan yang berikut ini sebagai templat pengurutan

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

 <procedure>

end

Apakah ada cara untuk menyertakan pemberian izin eksekusi hanya pada prosedur tersimpan itu sementara saya melakukannya?
Misalnya seperti ...

Grant execute [User_Execute] 

... tetapi hanya untuk prosedur tersimpan ini?

Saya telah melihat beberapa pertanyaan serupa lainnya tetapi semuanya merujuk pada SEMUA prosedur yang tersimpan dan bukan hanya satu, saya juga belum melihat satu di mana Anda dapat menentukan izin di dalam create procedureskrip. Bahkan jawaban tentang bagaimana saya dapat mengatur izin tanpa GUI untuk prosedur tersimpan tertentu akan diterima.

Sunting Jawaban teratas tentu menunjuk saya ke arah yang benar, ini pada dasarnya adalah apa yang saya cari, saya tidak berpikir tentang batching perintah yang akhirnya saya lakukan, batching perintah bersama dengan prosedur tersimpan saya. Ngomong-ngomong, saya pikir ini cukup apik.

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

<procedure>

end
GO
GRANT EXECUTE ON <procedurename> to <username>
GO

Kode yang disediakan dalam teks yang diedit valid dan jawaban yang benar untuk pertanyaan ini.
ninty9notout

Jawaban:



10

truncate table Menetapkan izin pada objek seperti prosedur tersimpan dapat dilakukan dengan:

GRANT EXECUTE ON <schema>.<object> to <user>;

Namun, Anda mungkin juga ingin memberikan hak keamanan di tingkat login dan pengguna. Anda akan ingin menentukan dan memberikan HANYA hak yang diperlukan untuk objek yang membutuhkan akses (seperti eksekusi). Pertimbangkan penggunaan EXECUTE ASkemampuan yang memungkinkan peniruan pengguna lain untuk memvalidasi izin yang diperlukan untuk mengeksekusi kode TANPA harus memberikan semua hak yang diperlukan untuk semua objek yang mendasarinya (misalnya tabel). EXECUTE ASdapat ditambahkan ke prosedur tersimpan, fungsi, pemicu, dll.

Tambahkan ke kode sebagai berikut tepat di dalam Prosedur Tersimpan:

CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER

Dalam hal ini Anda menyamar sebagai pemilik modul yang dipanggil. Anda juga dapat menyamar sebagai DIRI, ATAU pengguna membuat atau mengubah modul ATAU ... melangsungkan penelepon, yang akan memungkinkan modul untuk mengambil izin dari pengguna saat ini, ATAU ... meniru PEMILIK, yang akan mengambil izin dari pemilik prosedur yang disebut ATAU ... menyamar sebagai 'user_name', yang akan menyamar sebagai pengguna tertentu ATAU ... menyamar menjadi 'login_name' dengan akan menyamar sebagai login tertentu.

PALING, Anda hanya perlu memberikan EXECUTEhak kepada procs yang disimpan dan kemudian hak diberikan kepada semua objek yang dirujuk dalam proc yang disimpan.

Dengan cara ini, Anda TIDAK perlu memberikan hak tersirat (misalnya: untuk memperbarui data atau memanggil procs tambahan). Chaining kepemilikan menangani ini untuk Anda. Ini sangat membantu untuk sql dinamis atau jika Anda perlu membuat tugas keamanan yang ditinggikan seperti CREATE TABLE. EXECUTE ASadalah alat yang berguna untuk dipertimbangkan.

Contoh ini dapat membantu memperjelas semua ini:

Buat pengguna bernama NoPrivUser dengan akses publik ke basis data (mis. Dbadb):

USE [master];
GO 
CREATE LOGIN [NoPrivUser] WITH PASSWORD=N'ABC5%', DEFAULT_DATABASE=[dbadb], 
  CHECK_EXPIRATION=ON, CHECK_POLICY=ON;
GO 
USE [DBAdb];
GO 
CREATE USER [NoPrivUser] FOR LOGIN [NoPrivUser];
GO

CATATAN: PENCIPTA ATAU PEMILIK PROSEDUR INI AKAN MEMERLUKAN HAK TABEL dalam database target.

use DBAdb 
go 
CREATE PROCEDURE dbo.MyProcedure 
WITH EXECUTE AS OWNER 

truncate table MyTable

GO
GRANT EXEC ON dbo.MyProcedure TO NoPrivUser; 
GO
-- Now log into your database server as NoPrivUser and run the following.

Dengan EXECUTE ASklausa prosedur tersimpan dijalankan di bawah konteks pemilik objek. Kode ini berhasil dibuat dbo.MyTabledan baris berhasil dimasukkan. Dalam contoh ini, pengguna NoPrivUsersama sekali tidak memiliki hak yang diberikan untuk memodifikasi tabel, atau membaca atau memodifikasi data apa pun dalam tabel ini.

Hanya dibutuhkan hak yang diperlukan untuk menyelesaikan tugas khusus ini yang diberi kode DALAM konteks prosedur ini.

Metode menciptakan prosedur tersimpan yang dapat melakukan tugas-tugas yang memerlukan hak keamanan yang tinggi tanpa secara permanen menetapkan hak-hak itu menjadi sangat berguna.


4
Ini adalah jawaban yang sama yang Anda posting di SO kemarin , yang juga harus saya format agar mudah dibaca.
Aaron Bertrand

5

masukkan deskripsi gambar di sini

pilih login basis data -> Pergi ke Securable dan klik tombol Cari seperti pada gambar sebelumnya. Pada mengklik tombol Cari, Anda akan menemukan dia mengikuti jendela untuk menambahkan jenis objek.

Klik tombol Jenis Objek dan Anda akan mendapatkan jendela "Pilih Jenis Objek" dengan berbagai objek. Sekarang jika Anda melihat, prosedur tersimpan terdaftar di area jenis objek. Sekarang kita akan memilih prosedur tersimpan khusus kami yang ingin kami beri izin.


Pertama, pertanyaannya sudah lebih dari lima tahun ketika Anda menjawabnya. Itu akan baik-baik saja, kecuali OP secara khusus meminta solusi yang tidak menggunakan GUI dan dapat tertanam dalam skrip. Respons Anda tidak mengatasinya.
Eric Brandt
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.