sql >> データベース >  >> RDS >> Sqlserver

データを追加するための SQL アクセス許可と確認方法は?

    では、これを分解してみましょう:

    ユーザーがテーブルに書き込めることを確認します (true の場合は 1、そうでない場合は 0 を返します):

    SELECT isnull(has_perms_by_name('MyDb.dbo.MyTable', 'OBJECT', 'INSERT'), 0)
    

    ユーザーがそのパブリッシャーを書き込めることを確認します:

    SELECT count(*) FROM UserPermissions WHERE
    UserName = 'username' AND Publisher = 'publisher'
    

    さて、これはそれらの SQL であり、実際の C# ではありません。 C# で値を取得するには:

    SqlConnection SqlConn = new SqlConnection("connection_string_goes_here");
    SqlCommand SqlCmd = new SqlCommand();
    
    SqlConn.Open();
    SqlCmd.Connection = SqlConn;
    SqlCmd.CommandText = "SELECT isnull(has_perms_by_name('MyDb.dbo.MyTable', " +
        "'OBJECT', 'INSERT'), 0)"
    
    if (SqlCmd.ExecuteScalar())
    {
       SqlCmd.CommandText =
           "SELECT count(*) FROM UserPermissions WHERE " +
           "Username = " + System.Environment.UserDomainName + "\" + 
               System.Environment.UserName + " " +
           AND Publisher = @Publisher";
       SqlCmd.Parameters.Add("@Publisher", SqlDbType.NVarChar);
       SqlCmd.Parameters("@Publisher").Value = PublisherInput;
    
       if(SqlCmd.ExecuteScalar())
       {
           SqlCmd.Parameters.Clear();
           SqlCmd.CommandText = "INSERT INTO Books (Title, Publisher) VALUES " +
                                "(@Title, @Publisher)";
           SqlCmd.Parameters.Add("@Title", SqlDbType.NVarChar);
           SqlCmd.Parameters.Add("@Publisher", SqlDbType.NVarChar);
           SqlCmd.Parameters("@Title").Value = TitleInput;
           SqlCmd.Parameters("@Publisher").Value = PublisherInput;
           SqlCmd.ExecuteNonQuery();
       }
    }
    
    SqlCmd.Dispose();
    SqlConn.Close();
    SqlConn.Dispose();
    

    最後に、入力内容を整理してください .アプリケーションでパラメータを使用し、内部のユーザーであってもユーザーを信頼しない .いくら強調しても足りないほどです。

    編集:猫の皮を剥ぐ方法は複数あるため、LINQ to SQL ソリューションを含めないのは愚かだと思いました (少なくともカウントの問題に対して):

    int PermsAvailable = (from up in db.UserPermissions
                          where up.Username == 
                              System.Environment.UserDomainName + "\" + 
                              System.Environment.UserName
                          && up.Publisher == PublisherInput
                          select up).Count();
    if(PermsAvailable)
    {
        var NewBook = New Book with {.Title = TitleInput, .Publisher = PublisherInput};
        db.Books.Add(NewBook);
    }
    


    1. mysqlとjavaのTimeZoneの不一致

    2. パフォーマンス:サブクエリまたは結合

    3. information_schemaを使用して、制限に達しているすべての整数列を検索します

    4. WITH句に無関係なテーブルを追加すると、PostgreSQLのクエリが遅くなりますか?