Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analitik Platform Sistemi (PDW)
Microsoft Fabric'te SQL veritabanı
Bu makalede, SQL Server Veritabanı Altyapısı'ndaki çeşitli nesnelere kimlerin izinlere sahip olduğunu belirleme açıklanmaktadır. SQL Server, Veritabanı Altyapısı için iki izin sistemi uygular. Eski bir sabit rol sisteminde önceden yapılandırılmış izinler vardır. SQL Server 2005 (9.x) ile başlayarak daha esnek ve hassas bir sistem kullanılabilir.
Note
Bu makaledeki bilgiler SQL Server 2005 (9.x) ve sonraki sürümler için geçerlidir. Bazı izin türleri SQL Server'ın bazı sürümlerinde kullanılamaz.
Aşağıdaki noktaları her zaman aklınızda bulundurmanız gerekir:
- Etkili izinler, her iki izin sisteminin toplamıdır.
- İzin reddi, izinlerin verilmesini geçersiz kılar.
- Bir kullanıcı sysadmin sabit sunucu rolünün üyesiyse, izinler daha fazla işaretlenmez, bu nedenle reddetmeler uygulanmaz.
- Eski sistemle yeni sistemin benzerlikleri vardır. Örneğin,
sysadminsabit sunucu rolündeki üyelik,CONTROL SERVERiznine sahip olmakla benzerdir. Ama sistemler aynı değil. Örneğin, eğer bir giriş yalnızcaCONTROL SERVERiznine sahipse ve bir saklı yordamsysadminsabit sunucu rolünde üyelik kontrolü yapıyorsa, izin kontrolü başarısız olur. Tersi de geçerlidir. - Doku SQL veritabanında, veritabanı kullanıcıları için Microsoft Entra Id desteklenen tek kimlik doğrulama yöntemidir. Sunucu düzeyinde roller ve izinler kullanılamaz, yalnızca veritabanı düzeyinde kullanılabilir. Daha fazla bilgi için bkz. Microsoft Fabric SQL veritabanında yetkilendirme.
Summary
- Sunucu düzeyinde izin, sabit sunucu rollerindeki veya kullanıcı tanımlı sunucu rollerindeki üyelikten gelebilir. Herkes
publicsabit sunucu rolüne aittir ve orada atanan tüm izinleri alır. - Sunucu düzeyinde izinler, oturum açma bilgileri veya kullanıcı tanımlı sunucu rollerine verilen izinlerden kaynaklanabilir.
- Veritabanı düzeyinde izin, sabit veritabanı rollerindeki üyelikten veya her veritabanında kullanıcı tanımlı veritabanı rollerinden gelebilir. Herkes
publicsabit veritabanı rolüne aittir ve orada atanan tüm izinleri alır. - Veritabanı düzeyinde izinler, kullanıcılara izin vermelerinden veya her veritabanındaki kullanıcı tanımlı veritabanı rollerinden gelebilir.
- İzinlere, etkinleştirildiyse
guestgirişi veyaguestveritabanı kullanıcısı aracılığıyla erişilebilir.guestoturum açma özelliği ve kullanıcılar varsayılan olarak devre dışı bırakılır. - Windows kullanıcıları oturum açabilen Windows gruplarının üyeleri olabilir. SQL Server, bir Windows kullanıcısı bağlandığında ve bir Windows grubunun güvenlik tanımlayıcısını içeren bir Windows belirteci sunduğunda Windows grup üyeliğini öğrenir. SQL Server, Windows grup üyelikleri hakkında otomatik güncelleştirmeleri yönetmediğinden veya almadığından, SQL Server Windows grup üyeliğinden alınan Windows kullanıcılarının izinlerini güvenilir bir şekilde raporlayamaz.
- İzinler, bir uygulama rolüne geçirilerek ve parola sağlanarak elde edilebilir.
- İzinler,
EXECUTE ASyan tümcesini içeren bir saklı yordam yürütülerek elde edilebilir. - İzinler, oturum açarak veya
IMPERSONATEiznine sahip kullanıcılar tarafından edinilebilir. - Yerel bilgisayar yöneticisi grubunun üyeleri ayrıcalıklarını her zaman
sysadminolarak yükseltebilir. (SQL Veritabanı için geçerli değildir.) -
securityadminsabit sunucu rolünün üyeleri ayrıcalıklarının çoğunu yükseltebilir ve bazı durumlarda ayrıcalıklarısysadminolarak yükseltebilir. (SQL Veritabanı için geçerli değildir.) - SQL Server yöneticileri tüm oturum açma bilgileri ve kullanıcılar hakkında bilgi görebilir. Daha az ayrıcalıklı kullanıcılar genellikle yalnızca kendi kimlikleriyle ilgili bilgileri görür.
Eski sabit rol izin sistemi
Sabit sunucu rollerinin ve sabit veritabanı rollerinin değiştirilemeyen önceden yapılandırılmış izinleri vardır. Sabit sunucu rolünün üyesi olan kişileri belirlemek için aşağıdaki sorguyu yürütür:
Note
Sunucu düzeyi izninin kullanılamadığı SQL Veritabanı veya Azure Synapse Analytics için geçerli değildir.
is_fixed_role
sys.server_principals sütunu SQL Server 2012'de (11.x) eklendi. SQL Server'ın eski sürümleri için gerekli değildir.
SELECT SP1.name AS ServerRoleName,
ISNULL(SP2.name, 'No members') AS LoginName
FROM sys.server_role_members AS SRM
RIGHT JOIN sys.server_principals AS SP1
ON SRM.role_principal_id = SP1.principal_id
LEFT JOIN sys.server_principals AS SP2
ON SRM.member_principal_id = SP2.principal_id
WHERE SP1.is_fixed_role = 1 -- Remove for SQL Server 2008
ORDER BY SP1.name;
Note
Tüm oturum açma bilgileri ortak rolün üyeleridir ve kaldırılamaz. Sorgu, master veritabanındaki tabloları denetler, ancak şirket içi ürün için herhangi bir veritabanında yürütülebilir.
Sabit veritabanı rolünün üyesi olan kişileri belirlemek için her veritabanında aşağıdaki sorguyu yürütür.
SELECT DP1.name AS DatabaseRoleName,
ISNULL(DP2.name, 'No members') AS DatabaseUserName
FROM sys.database_role_members AS DRM
RIGHT JOIN sys.database_principals AS DP1
ON DRM.role_principal_id = DP1.principal_id
LEFT JOIN sys.database_principals AS DP2
ON DRM.member_principal_id = DP2.principal_id
WHERE DP1.is_fixed_role = 1
ORDER BY DP1.name;
Her role verilen izinleri anlamak için Books Online'daki çizimlerde rol açıklamalarına bakın (Sunucu düzeyinde rollerve veritabanı düzeyindeki roller ).
Daha yeni ayrıntılı izin sistemi
Bu sistem esnektir, bu da ayarlayan kişilerin kesin olmak istemesi durumunda karmaşık olabileceği anlamına gelir. İşleri basitleştirmek için rol oluşturma, rollere izin atama ve ardından insan gruplarını rollere ekleme yardımcı olur. Veritabanı geliştirme takımının etkinliği şemaya göre ayırması ve ardından tek tek tablolar veya yordamlar yerine tüm şemaya rol izinleri vermesi daha kolaydır. Gerçek dünya senaryoları karmaşıktır ve iş gereksinimleri beklenmeyen güvenlik gereksinimleri oluşturabilir.
Aşağıdaki görüntüde izinler ve birbirleriyle ilişkileri gösterilmektedir. Üst düzey izinlerden bazıları (CONTROL SERVERgibi) birçok kez listelenir. Bu makalede poster okunamayacak kadar küçük. Tam boyutlu Veritabanı Altyapısı İzinleri Posteri PDF biçiminde indirebilirsiniz.
Güvenlik sınıfları
İzinler sunucu düzeyinde, veritabanı düzeyinde, şema düzeyinde veya nesne düzeyinde vb. verilebilir. 26 düzey vardır (sınıflar olarak adlandırılır). Sınıfların alfabetik sırada tam listesi: APPLICATION ROLE, ASSEMBLY, ASYMMETRIC KEY, AVAILABILITY GROUP, CERTIFICATE, CONTRACT, DATABASE, DATABASESCOPED CREDENTIAL, ENDPOINT, FULLTEXT CATALOG, FULLTEXT STOPLIST, LOGIN, MESSAGE TYPE, OBJECT, REMOTE SERVICE BINDING, ROLE, ROUTE, SCHEMA, SEARCH PROPERTY LIST, SERVER, SERVER ROLE, SERVICE, SYMMETRIC KEY, TYPE, USER, XML SCHEMA COLLECTION. (Bazı sınıflar bazı SQL Server türlerinde kullanılamaz.) Her sınıf hakkında tam bilgi sağlamak için farklı bir sorgu gerekir.
Principals
sorumlularına izinler verilir. Sorumlular sunucu rolleri, oturum açma bilgileri, veritabanı rolleri veya kullanıcılar olabilir. Oturum açma bilgileri, birçok Windows kullanıcısı içeren Windows gruplarını temsil edebilir. Windows grupları SQL Server tarafından korunmadığından, SQL Server her zaman bir Windows grubunun üyesinin kim olduğunu bilmez. Bir Windows kullanıcısı SQL Server'a bağlandığında, oturum açma paketi kullanıcının Windows grup üyeliği belirteçlerini içerir.
Bir Windows kullanıcısı bir Windows grubunu temel alan oturum açma bilgilerini kullanarak bağlandığında, bazı etkinlikler SQL Server'ın tek tek Windows kullanıcısını temsil eden bir oturum açma veya kullanıcı oluşturmasını gerektirebilir. Örneğin, bir Windows grubu (Mühendisler) kullanıcıları (Mary, Todd, Pat) içerir ve Mühendisler grubunun veritabanı kullanıcı hesabı vardır. Mary'nin izni varsa ve bir tablo oluşturursa, tablonun sahibi olacak bir kullanıcı (Mary) oluşturulabilir. Ya da Todd'a Mühendisler grubunun geri kalanının sahip olduğu bir izin reddedilirse, izin reddini izlemek için Todd kullanıcısının oluşturulması gerekir.
Bir Windows kullanıcısının birden fazla Windows grubunun (örneğin, Mühendisler ve Yöneticiler) üyesi olabileceğini unutmayın. Mühendisler için oturum açma bilgilerine verilen veya reddedilen, Yöneticiler için oturum açma bilgilerine verilen veya reddedilen, kullanıcıya bireysel olarak verilen veya reddedilen ve kullanıcının üyesi olduğu rollere verilen veya reddedilen izinlerin tümü, etkili izinlerin belirlenmesi için toplanacak ve değerlendirilecektir.
HAS_PERMS_BY_NAME işlevi, bir kullanıcının veya oturum açmanın belirli bir izne sahip olup olmadığını ortaya koyabilir. Ancak, izin verme veya izin reddi kaynağını belirlemenin belirgin bir yolu yoktur. İzin listesini inceleyin ve belki deneme yanılma yoluyla deneyler yapın.
Yararlı sorgular
Sunucu izinleri
Aşağıdaki sorgu, sunucu düzeyinde verilen veya reddedilen izinlerin listesini döndürür. Bu sorgu master veritabanında yürütülmelidir.
Note
SQL Veritabanı veya Azure Synapse Analytics'te sunucu düzeyinde izinler verilemez veya sorgulanamaz.
SELECT pr.type_desc,
pr.name,
ISNULL(pe.state_desc, 'No permission statements') AS state_desc,
ISNULL(pe.permission_name, 'No permission statements') AS permission_name
FROM sys.server_principals AS pr
LEFT JOIN sys.server_permissions AS pe
ON pr.principal_id = pe.grantee_principal_id
WHERE is_fixed_role = 0 -- Remove for SQL Server 2008
ORDER BY pr.name,
type_desc;
Veritabanı izinleri
Aşağıdaki sorgu, veritabanı düzeyinde verilen veya reddedilen izinlerin listesini döndürür. Bu sorgu her veritabanında yürütülmelidir.
SELECT pr.type_desc,
pr.name,
ISNULL(pe.state_desc, 'No permission statements') AS state_desc,
ISNULL(pe.permission_name, 'No permission statements') AS permission_name
FROM sys.database_principals AS pr
LEFT JOIN sys.database_permissions AS pe
ON pr.principal_id = pe.grantee_principal_id
WHERE pr.is_fixed_role = 0
ORDER BY pr.name,
type_desc;
İzin tablosunun her izin sınıfı, bu güvenli hale getirilebilir sınıfı hakkında ilgili bilgileri sağlayan diğer sistem görünümlerine eklenebilir. Örneğin, aşağıdaki sorgu izinden etkilenen veritabanı nesnesinin adını sağlar.
SELECT pr.type_desc,
pr.name,
pe.state_desc,
pe.permission_name,
s.name + '.' + oj.name AS OBJECT,
major_id
FROM sys.database_principals AS pr
INNER JOIN sys.database_permissions AS pe
ON pr.principal_id = pe.grantee_principal_id
INNER JOIN sys.objects AS oj
ON oj.object_id = pe.major_id
INNER JOIN sys.schemas AS s
ON oj.schema_id = s.schema_id
WHERE class_desc = 'OBJECT_OR_COLUMN';
Belirli bir kullanıcının (bu örnekte HAS_PERMS_BY_NAME) bir izni olup olmadığını belirlemek için TestUser işlevini kullanın. Örneğin:
EXECUTE AS USER = 'TestUser';
SELECT HAS_PERMS_BY_NAME ('dbo.T1', 'OBJECT', 'SELECT');
REVERT;
Söz diziminin ayrıntıları için bkz. HAS_PERMS_BY_NAME.