2015-04-09 2 views
1

Я создаю веб-приложение, где можно управлять доступом пользователей к нескольким базам данных. Я использовал следующий код, чтобы получить доступ для чтения пользователей к базе данных:undo дает пользователю доступ к базе данных

public void giveUserReadRightsForDatabase(int serverID, string dbName, string dbUsername, string myPassword) 
    { 
     ISFramework.Database myDB = new ISFramework.Database(); 

     string myQuery = "IF NOT EXISTS (SELECT name FROM sys.sql_logins WHERE name ='" + dbUsername + "')" + Environment.NewLine + 
          "BEGIN" + Environment.NewLine + 
          "CREATE LOGIN " + dbUsername + " WITH PASSWORD = '" + myPassword + 
"', CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF" + Environment.NewLine + 
          "END" + Environment.NewLine + 

          "BEGIN TRY" + Environment.NewLine + 
          "USE [" + dbName + "]" + Environment.NewLine + 
          "CREATE USER " + dbUsername + " FOR LOGIN " + dbUsername + Environment.NewLine + 
          "USE [" + dbName + "]" + Environment.NewLine + 
          "ALTER ROLE db_datareader ADD MEMBER " + dbUsername + Environment.NewLine + 

          "END TRY" + Environment.NewLine + 
          "BEGIN CATCH" + Environment.NewLine + 
          "END CATCH"; 

     myDB.executeNonQuery("DBServer" + serverID, myQuery); 
    } 

и я использую следующий код, чтобы удалить разрешение:

public void removePermissionsForThisDatabase(int serverID, string dbUsername, string dbName) 
    { 
     ISFramework.Database myDB = new ISFramework.Database(); 

     string myQuery = "BEGIN TRY" + Environment.NewLine + 
          "USE [" + dbName + "]" + Environment.NewLine + 
          "CREATE USER " + dbUsername + " FOR LOGIN " + dbUsername + Environment.NewLine + 
          "USE [" + dbName + "]" + Environment.NewLine + 
          "ALTER ROLE db_datareader DROP MEMBER " + dbUsername + Environment.NewLine + 
          "USE [" + dbName + "]" + Environment.NewLine + 
          "ALTER ROLE db_datawriter DROP MEMBER " + dbUsername + Environment.NewLine + 
          "USE [" + dbName + "]" + Environment.NewLine + 
          "IF EXISTS (SELECT * FROM sys.sql_logins WHERE name = N'" + dbUsername + "')" + Environment.NewLine + 
          "DROP USER " + dbUsername + Environment.NewLine + 
          "IF EXISTS (SELECT * FROM sys.database_principals WHERE name = N'" + dbUsername + "')" + Environment.NewLine + 
          "DROP LOGIN " + dbUsername + Environment.NewLine + 
          "END TRY" + Environment.NewLine + 
          "BEGIN CATCH" + Environment.NewLine + 
          "END CATCH"; 

     myDB.executeNonQuery("DBServer" + serverID, myQuery); 
    } 

В конце первого способа, пользователь может получить доступ и прочитать базу данных, что хорошо. Хотя, когда я делаю второй метод, пользователь все равно может получить доступ к базе данных, что не очень хорошо. Я уже отлаживал и подтвердил, что программа использует методы и выполняет запросы, поэтому в самом запросе должна быть ошибка.

Я пробовал сделать следующую строку в самой SQL Server Management Studio, которая выполняет свою работу, поэтому я действительно не знаю, что сказать. Никогда не появляются сообщения об ошибках, но код не так, как должен.

USE [Dev_ISFramework] 
IF EXISTS (SELECT * FROM sys.sql_logins WHERE name = N'Johnny456') 
DROP USER Johnny456 
+2

Вы сказали * Никогда не появляются сообщения об ошибках *. это связано с тем, что вы завернули свой запрос с помощью 'BEGIN TRY' и' END CATCH' и ошибок, проглатываемых –

+0

Ах. Глупая ошибка. Я постараюсь удалить TRY ... CATCH и посмотреть, есть ли у меня что-нибудь. – GillesDV

+0

@JossefHarush О, бог, удалив этот глупый блок TRY CATCH, дал мне приличную ошибку. Я попытался создать нового пользователя, хотя уже есть такое. Глупая ошибка копирования/вставки. – GillesDV

ответ

2

Я не эксперт, но если ваш второй метод использует BEGIN TRY в начале вашего SQL, а затем попытаться создать пользователь, когда он существует вызывает исключение, которое молча пойманное. Поэтому ваши чередование роли не выполняется.

Вы должны пересмотреть весь код SQL, используемый в removePermissionsForThisDatabase(), чтобы сделать то, что вы хотите.

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