TooManyRowsAffectedException с зашифрованными триггерами

Вы не можете изменить свой раздел при использовании того раздела. Лучшая вещь состоит в том, чтобы определить Ваши разделы прежде, чем установить Ubuntu с Живым CD.

, Если, в то время как Вы устанавливаете с Живого CD, Вы выбираете Something else как Ваш выбор на Installation Type окно, можно определить разделы как Вам нравится.

необходимо будет отформатировать один раздел как /, создать раздел подкачки (приблизительно равный количеству RAM), и, если Вы не захотите терять документы и т.д., сделайте отдельное /home раздел. (Это также означает, что эти файлы являются отдельными, если необходимо переустановить к / раздел или обновить или попробовать другой дистрибутив - /home, не должен быть отформатирован <глоток> 1 ).

существуют сотни того, как to's на всем протяжении Интернета о том, как сделать это.

следующее является установкой в качестве примера для мультиначальной загрузки и совместного использования между Windows и Linux на 300 ГБ.

sda1 = ntfs 50gb (Windows 7)
sda2 = extended 250gb (for the following)
sda3 = ext4 25gb  (/ for 10.04)
sda4 = ext4 25gb (/ for 12.04)
sda5 = ext4 100gb (/home shared between 10.04 and 12.04²
sda6 = fat32 or ntfs 100gb for a shared drive between all 3 OS's

Все, что, будучи сказанным - и мой предпочел метод - можно все еще использовать gparted с Живого CD и уменьшить и отредактировать разделы с риском проигрывающих данных. Много учебных руководств там о том, как сделать это также - включая некоторых на YouTube.

<глоток> 1 Некоторые конфигурационные файлы (которые запускаются с ., например .config) могут испортить другую установку при использовании того же имени пользователя.

<глоток> 2 (каждая ОС Linux требует, чтобы другое имя пользователя избежало конфликта.)

13
задан Jon Masters 10 September 2009 в 03:34
поделиться

2 ответа

er... you might be able to decrypt them...

Edit: if you can't change code, decrypt, or disable then you have no code options on the SQL Server side.

However, You could try "disallow results from triggers Option" which is OK for SQL 2005 and SQL 2008 but will be removed in later versions. I don't know if it suppresses rowcount messages though.

1
ответ дан 1 December 2019 в 21:53
поделиться

У нас была такая же проблема со сторонней базой данных Sybase. К счастью, после некоторого изучения кода NHibernate и краткого обсуждения с разработчиками кажется, что существует простое решение, которое не требует изменений в NHibernate. Решение дано Фабио Мауло в этой ветке группы разработчиков NHibernate .

Чтобы реализовать это для Sybase, мы создали нашу собственную реализацию IBatcherFactory, унаследованную от NonBatchingBatcher, и переопределили метод AddToBatch (), чтобы удалить вызов VerifyOutcomeNonBatched () в предоставленном объекте IExpectation:

public class NonVerifyingBatcherFactory : IBatcherFactory
{
    public virtual IBatcher CreateBatcher(ConnectionManager connectionManager, IInterceptor interceptor)
    {
        return new NonBatchingBatcherWithoutVerification(connectionManager, interceptor);
    }
}

public class NonBatchingBatcherWithoutVerification : NonBatchingBatcher
{
    public NonBatchingBatcherWithoutVerification(ConnectionManager connectionManager, IInterceptor interceptor) : base(connectionManager, interceptor)
    {}

    public override void AddToBatch(IExpectation expectation)
    {
        IDbCommand cmd = CurrentCommand;
        ExecuteNonQuery(cmd);
        // Removed the following line
        //expectation.VerifyOutcomeNonBatched(rowCount, cmd);
    }
}

Чтобы сделать то же самое для SQL Server вам нужно будет наследовать от SqlClientBatchingBatcher, переопределить DoExectuteBatch () и удалить вызов VerifyOutcomeBatched () из объекта Expectations:

public class NonBatchingBatcherWithoutVerification : SqlClientBatchingBatcher
{
    public NonBatchingBatcherWithoutVerification(ConnectionManager connectionManager, IInterceptor interceptor) : base(connectionManager, interceptor)
    {}

    protected override void DoExecuteBatch(IDbCommand ps)
    {
        log.DebugFormat("Executing batch");
        CheckReaders();
        Prepare(currentBatch.BatchCommand);
        if (Factory.Settings.SqlStatementLogger.IsDebugEnabled)
        {
            Factory.Settings.SqlStatementLogger.LogBatchCommand(currentBatchCommandsLog.ToString());
            currentBatchCommandsLog = new StringBuilder().AppendLine("Batch commands:");
        }

        int rowsAffected = currentBatch.ExecuteNonQuery();

        // Removed the following line
        //Expectations.VerifyOutcomeBatched(totalExpectedRowsAffected, rowsAffected);

        currentBatch.Dispose();
        totalExpectedRowsAffected = 0;
        currentBatch = new SqlClientSqlCommandSet();
    }
}

Теперь вам нужно внедрить свои новые классы в NHibernate. Есть два известных мне способа сделать это:

  1. Укажите имя вашей реализации IBatcherFactory в свойстве конфигурации adonet.factory_class
  2. Создайте собственный драйвер, реализующий интерфейс IEmbeddedBatcherFactoryProvider

Учитывая, что мы уже В нашем проекте был специальный драйвер для решения проблем строки ANSI в Sybase 12, это было несложным изменением для реализации интерфейса следующим образом:

public class DriverWithCustomBatcherFactory : SybaseAdoNet12ClientDriver, IEmbeddedBatcherFactoryProvider
{
    public Type BatcherFactoryClass
    {
        get { return typeof(NonVerifyingBatcherFactory); }
    }

    //...other driver code for our project...
}

Драйвер можно настроить, указав имя драйвера с помощью свойства конфигурации connection.driver_class. Мы хотели использовать Fluent NHibernate, и это можно сделать с помощью Fluent следующим образом:

public class SybaseConfiguration : PersistenceConfiguration<SybaseConfiguration, SybaseConnectionStringBuilder>
{
    SybaseConfiguration()
    {
        Driver<DriverWithCustomBatcherFactory>();
        AdoNetBatchSize(1); // This is required to use our new batcher
    }

    /// <summary>
    /// The dialect to use
    /// </summary>
    public static SybaseConfiguration SybaseDialect
    {
        get
        {
            return new SybaseConfiguration()
                .Dialect<SybaseAdoNet12Dialect>();
        }
    }
}

и при создании фабрики сеансов мы используем этот новый класс следующим образом:

var sf = Fluently.Configure()
    .Database(SybaseConfiguration.SybaseDialect.ConnectionString(_connectionString))
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<MyEntity>())
    .BuildSessionFactory();

Наконец, вам нужно установить для свойства adonet.batch_size значение 1, чтобы гарантировать что используется ваш новый класс дозатора. В Fluent NHibernate это делается с помощью метода AdoNetBatchSize () в классе, который наследуется от PersistenceConfiguration (см. Выше пример конструктора класса SybaseConfiguration).

22
ответ дан 1 December 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: