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 AS
kemampuan 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 AS
dapat 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 EXECUTE
hak 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 AS
adalah 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 AS
klausa prosedur tersimpan dijalankan di bawah konteks pemilik objek. Kode ini berhasil dibuat dbo.MyTable
dan baris berhasil dimasukkan. Dalam contoh ini, pengguna NoPrivUser
sama 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.