PDA

View Full Version : نحوه بدست آوردن سطح دسترسی یک User چگونه است ؟



hadi_12766
پنج شنبه 08 خرداد 1393, 10:05 صبح
سلام چطوری میشه بفهمیم یک یوزر sql فقط امکان read داره یا write یا هر دو ؟
مثلا من یک برنامه نوشتم به کاربرم یک یوزر میدم و پسورد حالا برنامه باید پیغام مناسب به کاربر نشون بده و بگه شما فقط امکان read دارید یا write و یا هر دو . ممنون میشم راهنماییم کنید .

rezayeman
پنج شنبه 08 خرداد 1393, 14:57 عصر
راه های مختلفی برای این کار وجود داره
ساده ترین راهش اگه میخوای فقط 3 تا مقدار read, write, together بررسی کنی اینه که یه فیلد به جدوب user اضافه کنی و برای هر کاربر یکی از این 3 مقدارو در نظر بگیری و بعد در موقع لود هر کاربر این فیلد چک بشه و نسبت به سطح دسترسیش کارهای مورد نظر انجام بشه

hadi_12766
پنج شنبه 08 خرداد 1393, 20:06 عصر
متوجه منظورم نشدید من میخوام ماهیت اون یوزر رو بدست بیارم ... ضمنا یوزر ها که توی Login خود sql ذخیره هستند نه داخل جدول !
How to read settings of SQL Logins using Visual C# code
مثلا توی کد نویسی چطور میشه یوزر sa رو به برنامه بدیم اون بررسی کنه که owner هست یا نه ؟

pashna
پنج شنبه 08 خرداد 1393, 23:17 عصر
You looking for something like this ?

SELECT [UserName] = CASE princ.[type]
WHEN 'S' THEN princ.[name]
WHEN 'U'
THEN ulogin.[name] COLLATE Latin1_General_CI_AI
END ,
[UserType] = CASE princ.[type]
WHEN 'S' THEN 'SQL User'
WHEN 'U' THEN 'Windows User'
END ,
[DatabaseUserName] = princ.[name] ,
[Role] = NULL ,
[PermissionType] = perm.[permission_name] ,
[PermissionState] = perm.[state_desc] ,
[ObjectType] = obj.type_desc ,
[ObjectName] = OBJECT_NAME(perm.major_id) ,
[ColumnName] = col.[name]
FROM sys.database_principals princ
LEFT JOIN --Login accounts
sys.login_token ulogin ON princ.[sid] = ulogin.[sid]
LEFT JOIN sys.database_permissions perm ON perm.[grantee_principal_id] = princ.[principal_id]
LEFT JOIN sys.columns col ON col.[object_id] = perm.major_id
AND col.[column_id] = perm.[minor_id]
LEFT JOIN sys.objects obj ON perm.[major_id] = obj.[object_id]
WHERE princ.[type] IN ( 'S', 'U' )
UNION
SELECT [UserName] = CASE memberprinc.[type]
WHEN 'S' THEN memberprinc.[name]
WHEN 'U'
THEN ulogin.[name] COLLATE Latin1_General_CI_AI
END ,
[UserType] = CASE memberprinc.[type]
WHEN 'S' THEN 'SQL User'
WHEN 'U' THEN 'Windows User'
END ,
[DatabaseUserName] = memberprinc.[name] ,
[Role] = roleprinc.[name] ,
[PermissionType] = perm.[permission_name] ,
[PermissionState] = perm.[state_desc] ,
[ObjectType] = obj.type_desc ,
[ObjectName] = OBJECT_NAME(perm.major_id) ,
[ColumnName] = col.[name]
FROM sys.database_role_members members
JOIN sys.database_principals roleprinc ON roleprinc.[principal_id] = members.[role_principal_id]
JOIN sys.database_principals memberprinc ON memberprinc.[principal_id] = members.[member_principal_id]
LEFT JOIN sys.login_token ulogin ON memberprinc.[sid] = ulogin.[sid]
LEFT JOIN sys.database_permissions perm ON perm.[grantee_principal_id] = roleprinc.[principal_id]
LEFT JOIN sys.columns col ON col.[object_id] = perm.major_id
AND col.[column_id] = perm.[minor_id]
LEFT JOIN sys.objects obj ON perm.[major_id] = obj.[object_id]
UNION
SELECT [UserName] = '{All Users}' ,
[UserType] = '{All Users}' ,
[DatabaseUserName] = '{All Users}' ,
[Role] = roleprinc.[name] ,
[PermissionType] = perm.[permission_name] ,
[PermissionState] = perm.[state_desc] ,
[ObjectType] = obj.type_desc ,
[ObjectName] = OBJECT_NAME(perm.major_id) ,
[ColumnName] = col.[name]
FROM sys.database_principals roleprinc
LEFT JOIN --Role permissions
sys.database_permissions perm ON perm.[grantee_principal_id] = roleprinc.[principal_id]
LEFT JOIN --Table columns
sys.columns col ON col.[object_id] = perm.major_id
AND col.[column_id] = perm.[minor_id]
JOIN sys.objects obj ON obj.[object_id] = perm.[major_id]
WHERE roleprinc.[type] = 'R'
AND roleprinc.[name] = 'public'
AND obj.is_ms_shipped = 0
ORDER BY princ.[Name] ,
OBJECT_NAME(perm.major_id) ,
col.[name] ,
perm.[permission_name] ,
perm.[state_desc] ,
obj.type_desc--perm.[class_desc]

hadi_12766
جمعه 09 خرداد 1393, 07:55 صبح
آقا مرسی ولی یکم خلاصه تر نمیشه بنویسی متوجه بشم ؟

hadi_12766
شنبه 10 خرداد 1393, 08:14 صبح
خواهش میکنم یکی راهنمایی کنه !