ठीक है, आइए इसे तोड़ दें:
सत्यापित करें कि कोई उपयोगकर्ता तालिका में लिख सकता है (यह सही होने पर 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 से 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);
}