Операции только для чтения в SQL Server во внешней подсети - PullRequest
0 голосов
/ 06 мая 2019

Чтобы представить всех в контексте: у нас есть развернутое приложение Windows Forms, написанное на C # и запрашивающее данные из / в базу данных SQL Server 14. Все работает нормально, до того дня, когда нам нужно было вытолкнуть приложение за пределы основной подсети 192.168.0.X, до 192.168.1.X.

Здесь, с моим партнером, мы полагали, что небольшая переделка строки подключения может решить первую проблему, с которой мы столкнулись (нет подключения к БД; нет входа в систему, нет простых запросов, нет ничего), наряду с этим, что не позволяет нам записывать какие-либо данные в БД, используя хранимые процедуры или нет. Мы уже думали, что это может быть одним из источников этой проблемы, но это не так, потому что мы можем выполнять некоторые запросы SELECT без какой-либо драмы. Это, конечно, на зараженном ПК.

Ранее это было:

user id=myUser; password=myPass; server=myIP; Trusted_Connection=no; database=myDBName; connection timeout=30;

Теперь это:

Data Source=myServerName; Initial Catalog=myDatabaseName; User ID=myUsername;Password=myPassword; Server=IP, Port (if necessary);

Простой запрос выбора

Некоторые скриншоты исключений, напечатанные в MessageBox'ах:

1-е (и 3-е) исключение: возможные усеченные данные (это повторяется после 2-го)

2-е исключение: не удалось открыть соединение

Мы уже проверили TCP / IP, настройки портов из SSMS, переадресацию портов физического брандмауэра, другие варианты подключения. строка, разные конфиги IPv4, и кажется, что ничего не работает (даже с новым суперпользователем, со всеми привилегиями БД и Сервера). Итак, мы здесь, так близко и так далеки от решения этой проблемы.

2-й день Редактирование: Выполнение двойной проверки в уязвимом коде (где встречаются исключения), даже с предложениями, которые сделал @iakobski, все равно. Те же исключения, в том же месте. Единственное отличие заключается в скорости приложения, которое их выбрасывает, потому что оно может быстрее завершить ожидающую транзакцию, а исключения обрабатываются благодаря предложению finally.

Кроме того, как я заметил во время более глубокой отладки, INSERT или UPDATE сами по себе являются не проблемой, а хранимыми процедурами. Поскольку не удалось обновить / выбрать данные в модулях SP, которые используют форму SQLSERVERPROCEDURE.SQLSERVER.Exec , но не при вставке записи журнала (что, я считаю, является классическим способом выполнения команд SQL):

        SqlCommand cmd = new SqlCommand();
        con.ConnectionString = CadenaConexion;
        cmd.Connection = con;
        cmd.CommandText = "INSERT INTO LOG(LOG_ID_USUARIO,LOG_FECHA,LOG_PROCESO,LOG_CANTIDAD,LOG_PEDIDO,LOG_ITEM)" +
                          "VALUES(@log_id_usuario, @log_fecha, @log_proceso, @log_cantidad, @log_pedido, @log_item)";

        try
        {
            cmd.Parameters.Add("@log_id_usuario", SqlDbType.Int).Value = Log_id_usuario;
            cmd.Parameters.Add("@log_fecha", SqlDbType.DateTime).Value = Log_fecha;
            cmd.Parameters.Add("@log_proceso", SqlDbType.Text).Value = Log_proceso;
            cmd.Parameters.Add("@log_cantidad", SqlDbType.Int).Value = Log_cantidad;
            cmd.Parameters.Add("@log_pedido", SqlDbType.Int).Value = Log_pedido;
            cmd.Parameters.Add("@log_item", SqlDbType.Int).Value = Log_item;

            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();
            return true;
        }
        catch (Exception ex)
        {
            exSrc = "log";
            exMsg = ex.Message;
            exNota = "ERR_LogUsu01: No se ha podido Insertar el Registro a la Tabla Log";
            exStTr = ex.StackTrace;
            registrarEnLogErr();
            MessageBox.Show(ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error);
            return false;
        }
        finally { con.Close(); }

Итак, если вчера я был почти уверен, что этот маленький файл с именем SQLSERVERPROCEDURE.dll , который имеет прямые отношения с хранимыми процедурами, которые обрабатываются им, имеет много общего здесь, я уверен - сейчас. Каким-то образом он может использовать старую строку подключения, но я не знаю, как я могу ее изменить, потому что каждый вызов, который выполняется с этим файлом, ссылается на строку Conn. String как «DBSQL» (пытался изменить ее при вызове, помещая SharedData.Instance (). StringConexion, а также переменную 'cn' [с ToString ()], без удачи. Сказал, что Conn. String не определена). Посмотрите на определение в SP с вызовом .dll и сам файл .dll:

Модуль обновления:

        SqlConnection cn = new SqlConnection(SharedData.Instance().StringConexion);

        try
        {
            Dictionary<string, object> param = new Dictionary<string, object>();
            param.Add("@nta_venta", nta_venta);
            param.Add("@item", item);
            param.Add("@cantidad", cantidad);
            cn.Open();
            SQLSERVERPROCEDURE.SQLSERVER.Exec("DBSQL", SP, param);
            cn.Close();
        }
        catch (Exception ex)
        {
            exSrc = this.Name;
            exMsg = ex.Message;
            exNota = "ERR_Corte02: Pedido: " + nta_venta + "-" + item + " con Falta de Parámetros válidos en Actualiza";
            exStTr = ex.StackTrace;
            registrarEnLogErr();
            MessageBox.Show(ex.Message);
        }
        finally { cn.Close(); }

Файл DLL: заголовок в VS: SQLSERVER (из метаданных)

#region Ensamblado SQLSERVERPROCEDURE, Version=1.0.0.0, Culture=neutral, 

PublicKeyToken=null
// C:\Users\User\source\repos\MY-APP\packages\EXECSQLSERVERPROCEDURE.2.0.0\lib\net40\SQLSERVERPROCEDURE.dll
#endregion

using System.Collections.Generic;
using System.Data;

namespace SQLSERVERPROCEDURE
{
    public static class SQLSERVER
    {
        public static DataTable Exec(string NombreConexion, string Procedimiento, Dictionary<string, object> VariableYValores, DataTable dt = null);
        public static DataSet Exec(string NombreConexion, string Procedimiento, Dictionary<string, object> VariableYValores, DataSet ds = null);
        public static void Exec(string NombreConexion, string Procedimiento, Dictionary<string, object> VariableYValores);
    }
}

1st StackTrace (больше не действителен, поскольку он разрешен с помощью заново выполненных операторов Open и Close):

Excepción producida: 'System.Data.SqlClient.SqlException' en System.Data.dll
El subproceso 0x3f5c terminó con código 0 (0x0).
Excepción producida: 'System.Data.SqlClient.SqlException' en SQLSERVERPROCEDURE.dll
Excepción producida: 'System.InvalidOperationException' en System.Data.dll
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Transactions.resources\v4.0_4.0.0.0_es_b77a5c561934e089\System.Transactions.resources.dll' cargado. El módulo se compiló sin símbolos.
System.Transactions Critical: 0 : <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Critical"><TraceIdentifier>http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/Unhandled</TraceIdentifier><Description>Excepción no controlada</Description><AppDomain>myApp.exe</AppDomain><Exception><ExceptionType>System.InvalidOperationException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType><Message>No está autorizado a cambiar la propiedad 'ConnectionString'. El estado actual de la conexión es abierta.</Message><StackTrace>   en System.Data.SqlClient.SqlConnection.ConnectionString_Set(DbConnectionPoolKey key)
   en System.Data.SqlClient.SqlConnection.set_ConnectionString(String value)
   en MY_APP.Class.log_errores.INSERT_log_err() en C:\Users\User\Source\Repos\MY-APP\MY APP\Class\log_errores.cs:línea 34
   en MY_APP.PrcsCorte.registrarEnLogErr() en C:\Users\User\Source\Repos\MY-APP\MY APP\PrcsCorte.cs:línea 378
   en MY_APP.PrcsCorte.cargarPedido(Int32 nv, Int32 it) en C:\Users\User\Source\Repos\MY-APP\MY APP\PrcsCorte.cs:línea 267
   en MY_APP.PrcsCorte.PrcsCorte_Activated(Object sender, EventArgs e) en C:\Users\User\Source\Repos\MY-APP\MY APP\PrcsCorte.cs:línea 39
   en System.Windows.Forms.Form.OnActivated(EventArgs e)
   en System.Windows.Forms.Form.set_Active(Boolean value)
   en System.Windows.Forms.Form.WmActivate(Message&amp;amp; m)
   en System.Windows.Forms.Form.WndProc(Message&amp;amp; m)
   en System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&amp;amp; m)
   en System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&amp;amp; m)
   en System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)</StackTrace><ExceptionString>System.InvalidOperationException: No está autorizado a cambiar la propiedad 'ConnectionString'. El estado actual de la conexión es abierta.
   en System.Data.SqlClient.SqlConnection.ConnectionString_Set(DbConnectionPoolKey key)
   en System.Data.SqlClient.SqlConnection.set_ConnectionString(String value)
   en MY_APP.Class.log_errores.INSERT_log_err() en C:\Users\User\Source\Repos\MY-APP\MY APP\Class\log_errores.cs:línea 34
   en MY_APP.PrcsCorte.registrarEnLogErr() en C:\Users\User\Source\Repos\MY-APP\MY APP\PrcsCorte.cs:línea 378
   en MY_APP.PrcsCorte.cargarPedido(Int32 nv, Int32 it) en C:\Users\User\Source\Repos\MY-APP\MY APP\PrcsCorte.cs:línea 267
   en MY_APP.PrcsCorte.PrcsCorte_Activated(Object sender, EventArgs e) en C:\Users\User\Source\Repos\MY-APP\MY APP\PrcsCorte.cs:línea 39
   en System.Windows.Forms.Form.OnActivated(EventArgs e)
   en System.Windows.Forms.Form.set_Active(Boolean value)
   en System.Windows.Forms.Form.WmActivate(Message&amp;amp; m)
   en System.Windows.Forms.Form.WndProc(Message&amp;amp; m)
   en System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&amp;amp; m)
   en System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&amp;amp; m)
   en System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)</ExceptionString></Exception></TraceRecord>
Excepción no controlada del tipo 'System.InvalidOperationException' en System.Data.dll
No está autorizado a cambiar la propiedad 'ConnectionString'. El estado actual de la conexión es abierta.

El subproceso 0x2e54 terminó con código 0 (0x0).
El subproceso 0x42cc terminó con código 0 (0x0).
El subproceso 0x3d84 terminó con código 0 (0x0).

Excepción no controlada: System.InvalidOperationException: No está autorizado a cambiar la propiedad 'ConnectionString'. El estado actual de la conexión es abierta.
   en System.Data.SqlClient.SqlConnection.ConnectionString_Set(DbConnectionPoolKey key)
   en System.Data.SqlClient.SqlConnection.set_ConnectionString(String value)
   en MY_APP.Class.log_errores.INSERT_log_err() en C:\Users\User\Source\Repos\MY-APP\MY APP\Class\log_errores.cs:línea 34
   en MY_APP.PrcsCorte.registrarEnLogErr() en C:\Users\User\Source\Repos\MY-APP\MY APP\PrcsCorte.cs:línea 378
   en MY_APP.PrcsCorte.cargarPedido(Int32 nv, Int32 it) en C:\Users\User\Source\Repos\MY-APP\MY APP\PrcsCorte.cs:línea 267
   en MY_APP.PrcsCorte.PrcsCorte_Activated(Object sender, EventArgs e) en C:\Users\User\Source\Repos\MY-APP\MY APP\PrcsCorte.cs:línea 39
   en System.Windows.Forms.Form.OnActivated(EventArgs e)
   en System.Windows.Forms.Form.set_Active(Boolean value)
   en System.Windows.Forms.Form.WmActivate(Message& m)
   en System.Windows.Forms.Form.WndProc(Message& m)
   en System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   en System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   en System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
El programa '[17180] myApp.exe' terminó con código 0 (0x0).

2nd StackTrace:

'myApp.exe' (CLR v4.0.30319: DefaultDomain): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: DefaultDomain): 'C:\Users\User\Source\Repos\MY-APP\MY APP\bin\Debug\myApp.exe' cargado. Símbolos cargados.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Data.resources\v4.0_4.0.0.0_es_b77a5c561934e089\System.Data.resources.dll' cargado. El módulo se compiló sin símbolos.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.Transactions\v4.0_4.0.0.0__b77a5c561934e089\System.Transactions.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.Wrapper.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Runtime.Caching\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Runtime.Caching.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Numerics\v4.0_4.0.0.0__b77a5c561934e089\System.Numerics.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms.resources\v4.0_4.0.0.0_es_b77a5c561934e089\System.Windows.Forms.resources.dll' cargado. El módulo se compiló sin símbolos.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_es_b77a5c561934e089\mscorlib.resources.dll' cargado. El módulo se compiló sin símbolos.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\Users\User\Source\Repos\MY-APP\MY APP\bin\Debug\SQLSERVERPROCEDURE.dll' cargado. No se encuentra el archivo PDB o no se puede abrir.
'myApp.exe' (CLR v4.0.30319: myApp.exe): 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\PrivateAssemblies\Runtime\Microsoft.VisualStudio.Debugger.Runtime.dll' cargado. Se omitió la carga de símbolos. El módulo está optimizado y la opción del depurador 'Sólo mi código' está habilitada.
Excepción producida: 'System.Data.SqlClient.SqlException' en System.Data.dll
Excepción producida: 'System.Data.SqlClient.SqlException' en System.Data.dll
El subproceso 0x1184 terminó con código 0 (0x0).
El subproceso 0xfe0 terminó con código 0 (0x0).
El subproceso 0xc70 terminó con código 0 (0x0).
El subproceso 0x4b64 terminó con código 0 (0x0).
El subproceso 0x5e04 terminó con código 0 (0x0).
El subproceso 0x3ef4 terminó con código 0 (0x0).
El subproceso 0x3b58 terminó con código 0 (0x0).
El subproceso 0x480c terminó con código 0 (0x0).
Excepción producida: 'System.Data.SqlClient.SqlException' en SQLSERVERPROCEDURE.dll
El subproceso 0x48f0 terminó con código 0 (0x0).
El subproceso 0x4238 terminó con código 0 (0x0).
Excepción producida: 'System.Data.SqlClient.SqlException' en System.Data.dll
El subproceso 0x5ddc terminó con código 0 (0x0).
El subproceso 0x5184 terminó con código 0 (0x0).
El subproceso 0x3074 terminó con código 0 (0x0).
El subproceso 0x3bdc terminó con código 0 (0x0).
El subproceso 0x55f4 terminó con código 0 (0x0).
El subproceso 0x44b4 terminó con código 0 (0x0).
El programa '[18484] myApp.exe' terminó con código 0 (0x0).

SSMS Скриншоты:

Роли сервера

Роли в базе данных

Права доступа

Настройки и статус

1 Ответ

1 голос
/ 07 мая 2019

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

using(SqlConnection connection = new SqlConnection(<connection string>))
{
    connection.Open();
    // database interaction here
}

Соединение будет удалено при выходе из блока использования. Не беспокойтесь, что вы создаете много соединений и думаете, что это снизит производительность, пул соединений с этим справится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...