Được rồi, hãy chia nhỏ điều này:
Xác minh rằng người dùng có thể ghi vào bảng (điều này sẽ trả về 1 nếu đúng, 0 nếu không):
SELECT isnull (has_perms_by_name ('MyDb.dbo.MyTable', 'OBJECT', 'INSERT'), 0)
Xác minh rằng người dùng có thể viết nhà xuất bản đó:
SELECT count (*) FROM UserPermissions WHEREUserName ='username' AND Publisher ='publisher'
Bây giờ, đó là SQL cho những thứ đó, chứ không phải C # thực tế. Để nhận các giá trị trong C #:
SqlConnection SqlConn =new SqlConnection ("connection_string_goes_here"); SqlCommand SqlCmd =new SqlCommand (); SqlConn.Open (); SqlCmd.Connection =SqlConby_ dbo.MyTable ', "+"' OBJECT ',' INSERT '), 0) "if (SqlCmd.ExecuteScalar ()) {SqlCmd.CommandText =" SELECT count (*) FROM UserPermissions WHERE "+" Username ="+ Hệ thống .Enosystem.UserDomainName + "\" + System.Enosystem.UserName + "" + AND Publisher =@Publisher "; SqlCmd.Parameters.Add (" @ Publisher ", SqlDbType.NVarChar); SqlCmd.Parameters (" @ Publisher ") .Value =PublisherInput; if (SqlCmd.ExecuteScalar ()) {SqlCmd.Parameters.Clear (); SqlCmd.CommandText ="CHÈN VÀO Sách (Tên sách, Nhà xuất bản) GIÁ TRỊ" + "(@Title, @Publisher)"; SqlCmd. Parameters.Add ("@ Title", SqlDbType.NVarChar); SqlCmd.Parameters.Add ("@ Publisher", SqlDbType.NVarChar); SqlCmd.Parameters ("@ Title"). Value =Titl eInput; SqlCmd.Parameters ("@ Publisher"). Giá trị =PublisherInput; SqlCmd.ExecuteNonQuery (); }} SqlCmd.Dispose (); SqlConn.Close (); SqlConn.Dispose ();
Lưu ý cuối cùng, hãy xóa thông tin đầu vào của bạn . Sử dụng các tham số trong ứng dụng của bạn và không tin tưởng bất kỳ người dùng nào, ngay cả những người nội bộ . Tôi không thể nhấn mạnh đến mức đó.
Chỉnh sửa:Bởi vì có nhiều cách để lột da mèo, tôi cảm thấy thật ngu ngốc khi không đưa giải pháp LINQ to SQL vào (ít nhất là về vấn đề số lượng):
« ); if (PermsAvailable) {var NewBook =Sách mới với {.Title =TitleInput, .Publisher =PublisherInput}; db.Books.Add (Sách mới);}