Saya perlu membatasi akses ke pengguna tertentu, tetapi mereka masih harus dapat melihat data dalam tabel yang dimiliki oleh dbo.
Saya mencoba melakukan hal berikut:
- skema dbo berfungsi seperti biasanya, memiliki akses ke semuanya
- schema1 schema memiliki akses ke hanya obyek schema1
- jika skema1 melihat atau prosedur tersimpan mengakses data dalam tabel yang dimiliki oleh dbo, rantai izin tepat
- user1 memiliki akses ke schema1, dan tidak ada yang lain; kecuali dalam kasus # 3
Inilah yang saya coba:
- Buat pengguna1 pengguna dipetakan ke login uji coba dengan kata sandi acak
- Membuat beberapa tabel dalam skema dbo dengan beberapa data uji di dalamnya
- Membuat skema skema1
- Membuat schema1.get_profiles yang memilih dari tampilan yang disebut schema1.profiles yang mengakses data di dbo.people, dbo.taglinks, dan dbo.tags
Namun, menggunakan pernyataan berikut saat login sebagai user1:
EXEC get_profiles 1
menghasilkan:
The SELECT permission was denied on the object 'tags', database 'schema_test', schema 'dbo'.
Saya sudah mencoba WITH EXECUTE AS OWNER
dan tidak bisa mulai memahami bagaimana "rantai kepemilikan" seharusnya berfungsi.
Saya juga sudah mencoba
GRANT EXECUTE ON SCHEMA::schema1 TO user1
GRANT INSERT ON SCHEMA::schema1 TO user1
GRANT SELECT ON SCHEMA::schema1 TO user1
GRANT UPDATE ON SCHEMA::schema1 TO user1
GRANT VIEW DEFINITION ON SCHEMA::schema1 TO user1
tapi saya mendapatkan kesalahan berikut (meskipun menjadi pengguna dengan akses dbo-level):
Cannot grant, deny, or revoke permissions to sa, dbo, entity owner, information_schema, sys, or yourself.
Yang saya butuhkan adalah user1 untuk dapat mengakses data melalui prosedur tersimpan yang saya berikan, dan tidak ada yang lain.
Selain itu, ini dimaksudkan untuk akhirnya hidup pada database SQL Azure yang ada, tapi saya menguji terhadap database dummy lokal terlebih dahulu.
sumber
Jawaban:
Konsep dasarnya adalah menggunakan Izin Skema GRANT / DENY . Anda dapat mengelola izin secara efisien dengan membuat peran dan kemudian menambahkan anggota ke dalamnya.
Di bawah ini adalah contoh yang akan menjelaskan Anda secara rinci
Sekarang uji:
Sekarang buat Prosedur yang Disimpan:
Sekarang Berikan izin untuk menjalankan UserA di schemaB's SP
Uji .. untuk melihat apakah UserA mampu menjalankan SP dari schemaB. Ini akan LULUS
Tetapi UserA tidak akan dapat melihat data dari SchemaB
Atau Anda dapat menggunakan DATABASE ROLE dan hanya menambahkan pengguna ke dalamnya untuk pengelolaan izin yang lebih baik:
Pernyataan di bawah ini akan memastikan bahwa UserA dapat melihat schemaA dan NOT schemaB. Hal yang baik adalah Anda bisa menambahkan pengguna
SchemaBUsesSchemaAProc
peran dan mereka akan mewarisi semua izin yang diberikan untuk peran itu.Jika Anda hanya ingin mengizinkan UserA untuk menjalankan SP yang dimiliki oleh SchemaB maka pernyataan di bawah ini akan melakukan pekerjaan:
Dengan cara ini, UserA tidak dapat melihat tabel SchemaB, tetapi masih dapat menjalankan procs dari SchemaB.
Di bawah ini akan menjelaskan hierarki izin :
sumber