2015-04-13 3 views
0

Я создаю приложение winforms, которое использует Integrated Security на SQL Server. В настоящее время я делаю следующее, чтобы убедиться, что пользователь информирован о том, что у него нет доступа к определенной схеме (у всех есть разрешения выбора, но у некоторых есть обновление и вставка).Проверьте, есть ли у пользователя разрешения на обновление/выбор/вставка перед выполнением

try 
     { 
      string sqlx = "select * from test.t"; 
      SqlCommand comm = new SqlCommand(sqlx, conn); 


      conn.Open(); 
      comm.ExecuteNonQuery(); 
      conn.Close(); 
      return; 
     } 
     catch (SqlException ex) 
     { 
      if (ex.Number == 229 | ex.Number == 230) 
       System.Windows.Forms.MessageBox.Show("You do not have permission to update this table. Please contact your system admin for permission."); 
      else 
       System.Windows.Forms.MessageBox.Show(ex.Message); 
     } 

     catch (Exception ex) 
     { 
      System.Windows.Forms.MessageBox.Show(ex.Message); 

     } 
     finally 
     { 
      conn.Close(); 
     } 

Вместо того, чтобы дать пользователям возможность даже нажать кнопку удаления, например, есть способ «prescreen» а пользователям привилегии из C#?

ответ

4

Попробуйте это:

SELECT * FROM fn_my_permissions('dbo', 'SCHEMA') 

Она возвращает список разрешений против 'ДБО' схемы для подключенного пользователя:

entity_name subentity_name permission_name 
dbo   NULL   SELECT 
dbo   NULL   INSERT 
dbo   NULL   UPDATE 
dbo   NULL   DELETE 
dbo   NULL   REFERENCES 
dbo   NULL   EXECUTE 
dbo   NULL   VIEW CHANGE TRACKING 
dbo   NULL   VIEW DEFINITION 
dbo   NULL   ALTER 
dbo   NULL   TAKE OWNERSHIP 
dbo   NULL   CONTROL 

Таким образом, вы можете просто искать INSERT или UPDATE по мере необходимости:

if exists (SELECT * FROM fn_my_permissions('dbo', 'SCHEMA') where permission_name = 'INSERT') 
begin 
    select 'Yes' 
end 
else 
begin 
    select 'No' 
end 
+0

Оба ответа были именно тем, что я искал. Не совсем решение C#, но все равно одно, которое должно хорошо работать. Спасибо! – brhardwick

0

Вы можете сделать

select fn_my_permissions('schema.tablename', 'OBJECT'); 
1

Вы можете сделать

select fn_my_permissions('schema.tablename', 'OBJECT'); 

или

HAS_PERMS_BY_NAME ('schema.tablename', 'OBJECT', 'INSERT')

Has_perms был установлен в 2008 году и после.

Смежные вопросы