执行前检查用户是否有 Update/Select/Insert 权限

Check if user has Update/Select/Insert permissions before execute

我正在构建一个在 SQL 服务器上使用集成安全性的 winforms 应用程序。现在,我执行以下操作以确保通知用户 he/she 无法访问某个模式(每个人都有 select 权限,但很少有人有更新和插入)。

 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();
        }

例如,有没有办法从 C# 中 "prescreen" 用户权限,而不是让用户甚至可以单击删除按钮?

你可以做一个

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

试试这个:

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

它将 return 针对已连接用户的 'dbo' 架构的权限列表:

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

你可以做一个

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

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

Has_perms 是为 2008 年及之后安装的。