Sql error code 204 firebird

sql error -204 : similar to existing bug but with requested details [CORE2139] #2570 Comments Submitted by: julian bui (jbu311) Related to a bug found in the bug tracker. It looks like nobody did anything with that one because they didn’t have queries. I was able to duplicate the bug and here are the […]

Содержание

  1. sql error -204 : similar to existing bug but with requested details [CORE2139] #2570
  2. Comments
  3. SQL error code = -204 [DNET514] #497
  4. Comments
  5. Select on empty database generate: internal Firebird consistency check (cannot find tip page (165), file: tra.cpp line: 2369 [CORE4734] #5040
  6. Comments

sql error -204 : similar to existing bug but with requested details [CORE2139] #2570

Submitted by: julian bui (jbu311)

Related to a bug found in the bug tracker. It looks like nobody did anything with that one because they didn’t have queries. I was able to duplicate the bug and here are the queries I used. Fields are censored for privacy reasons.

//NEXT THREE LINES EXECUTE WITHOUT ERRORS
String createTableQueryString = «CREATE TABLE MY_TABLE (aaaSMALLINT, bbbBIGINT, cccSMALLINT, ddd DOUBLE PRECISION, eee CHAR(16));»;
PreparedStatement ps = conn.prepareStatement(createTableQueryString);
ps.execute();

//NEXT FEWLINES PRODUCE ERROR:
try <
dataInsertPs = conn.prepareStatement(«INSERT INTO MY_TABLE (aaa, bbb, ccc, ddd, eee) VALUES (?, ?, ?, ?, ? )»);
> catch (SQLException ex) <
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, «Could not create prepared statement», ex);
>

ERROR:
databaseURL = jdbc:firebirdsql:embedded:V:TempDB.FDB
Oct 22, 2008 1:24:06 PM Main createPreparedStatement
SEVERE: Could not create prepared statement
org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -204
Table unknown
MY_TABLE
At line 1, column 13
at org.firebirdsql.jdbc.AbstractPreparedStatement. (AbstractPreparedStatement.java:127)
at org.firebirdsql.jdbc.FBPreparedStatement. (FBPreparedStatement.java:41)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.firebirdsql.jdbc.FBStatementFactory.createPreparedStatement(FBStatementFactory.java:90)
at org.firebirdsql.jdbc.AbstractConnection.prepareStatement(AbstractConnection.java:869)
at org.firebirdsql.jdbc.AbstractConnection.prepareStatement(AbstractConnection.java:824)
at org.firebirdsql.jdbc.AbstractConnection.prepareStatement(AbstractConnection.java:817)
at org.firebirdsql.jdbc.AbstractConnection.prepareStatement(AbstractConnection.java:293)
at Main.createPreparedStatement(Main.java:101)
at Main.main(Main.java:189)

The text was updated successfully, but these errors were encountered:

Источник

SQL error code = -204 [DNET514] #497

Submitted by: Rand Random (rand.random)

I installed the new .NET Provider and tried to update my EDMX Model (with Database First) but I am getting the following in my output window:

Unable to generate the model because of the following exception: ‘An error occurred while executing the command definition. See the inner exception for details.
Dynamic SQL Error
SQL error code = -204
Data type unknown
Implementation limit exceeded
COLUMN DSQL internal
Dynamic SQL Error
SQL error code = -204
Data type unknown
Implementation limit exceeded
COLUMN DSQL internal
‘.
Loading metadata from the database took 00:00:00.4426206.
Generating the model took 00:00:07.6167923.
Added the connection string to the App.Config file.
Writing the .edmx file took 00:00:00.0012551.

I am creating the following Domain, since Firebird 2.5 and earlier is lacking support for boolean:

SET TERM !! ;
EXECUTE BLOCK AS BEGIN

if (exists(select 1 from rdb$fields f, rdb$types t
where f.rdb$field_name=’BOOLEAN’
and f.rdb$field_type=t.rdb$type
and t.rdb$field_name=’RDB$FIELD_TYPE’)) then
execute statement ‘drop DOMAIN BOOLEAN;’;

execute statement ‘CREATE DOMAIN BOOLEAN
AS SMALLINT DEFAULT 0
CHECK (value in (0, 1));’;
END!!
SET TERM ; !!

could this be the root of the problem, and how would I fix it?

Thanks in advance.

The text was updated successfully, but these errors were encountered:

Modified by: Rand Random (rand.random)

description: I installed the new .NET Provider and tried to update my EDMX Model (with Database First) but I am getting the following in my output window:

Unable to generate the model because of the following exception: ‘An error occurred while executing the command definition. See the inner exception for details.
Dynamic SQL Error
SQL error code = -204
Data type unknown
Implementation limit exceeded
COLUMN DSQL internal
Dynamic SQL Error
SQL error code = -204
Data type unknown
Implementation limit exceeded
COLUMN DSQL internal
‘.
Loading metadata from the database took 00:00:00.4426206.
Generating the model took 00:00:07.6167923.
Added the connection string to the App.Config file.
Writing the .edmx file took 00:00:00.0012551.

I am creating the following Domain, since Firebird 2.5 and earlier is lacking support for boolean:

SET TERM !! ;
EXECUTE BLOCK AS BEGIN

if (exists(select 1 from rdb$fields f, rdb$types t
where f.rdb$field_name=’BOOLEAN’
and f.rdb$field_type=t.rdb$type
and t.rdb$field_name=’RDB$FIELD_TYPE’)) then
execute statement ‘drop DOMAIN BOOLEAN;’;

execute statement ‘CREATE DOMAIN BOOLEAN
AS SMALLINT DEFAULT 0
CHECK (value in (0, 1));’;
END!!
SET TERM ; !!

could this be the root of the problem, and how would I fix it?

In my Database I have

I installed the new .NET Provider and tried to update my EDMX Model (with Database First) but I am getting the following in my output window:

Unable to generate the model because of the following exception: ‘An error occurred while executing the command definition. See the inner exception for details.
Dynamic SQL Error
SQL error code = -204
Data type unknown
Implementation limit exceeded
COLUMN DSQL internal
Dynamic SQL Error
SQL error code = -204
Data type unknown
Implementation limit exceeded
COLUMN DSQL internal
‘.
Loading metadata from the database took 00:00:00.4426206.
Generating the model took 00:00:07.6167923.
Added the connection string to the App.Config file.
Writing the .edmx file took 00:00:00.0012551.

I am creating the following Domain, since Firebird 2.5 and earlier is lacking support for boolean:

SET TERM !! ;
EXECUTE BLOCK AS BEGIN

if (exists(select 1 from rdb$fields f, rdb$types t
where f.rdb$field_name=’BOOLEAN’
and f.rdb$field_type=t.rdb$type
and t.rdb$field_name=’RDB$FIELD_TYPE’)) then
execute statement ‘drop DOMAIN BOOLEAN;’;

execute statement ‘CREATE DOMAIN BOOLEAN
AS SMALLINT DEFAULT 0
CHECK (value in (0, 1));’;
END!!
SET TERM ; !!

could this be the root of the problem, and how would I fix it?

Источник

Select on empty database generate: internal Firebird consistency check (cannot find tip page (165), file: tra.cpp line: 2369 [CORE4734] #5040

Submitted by: Carl-Johan Wik (cjwik)

Below you will find the code for the connection information object that the test program.

This done in Visual Studio 2013, Windows 8.1, Firebird 2.5.4 and Firebird http://ADO.NET Data provider. 4.5.0.0

The thing I find is that if the database is empty and I do select, then it goes into a failed state that I cannot resolve and have to recreate the database.

Procedure to reproduce:
Run the program, the program will pass con.Open and throw exception on the cmd.ExecuteScalar and the exception says table unknown. I.e. an expected exception.
Re-run the program, now the con.Open will throw an exception with the information: internal Firebird consistency check (cannot find tip page (165), file: tra.cpp line: 2369
If I try to re-run the program again the same exception happen on the con.Open statement. I cannot get pass this and have to recreate the database. I.e. the database in failed state.

New test run.
I run the program but this time execute the create table statement. No exception.
Re-run the program but with the select statement on a table that do not exist. Program will pass con.Open and throw exception on the cmd.ExecuteScalar and the exception says table unknown. I.e. an expected exception.
I can now re-run the program several times and the con.Open will always work and I get the expected exception of table unknown.

It seems that if I do a Select on at table on an empty database then this error happen, otherwise not.

Was not sure to report this as blocker, but it is a blocker for me as I cannot use Firebird with such a error in a production environment.

The text was updated successfully, but these errors were encountered:

Modified by: Carl-Johan Wik (cjwik)

Below you will find the code for the connection information object that the test program.

This done in Visual Studio 2013, Windows 8.1, Firebird 2.5.4 and Firebird http://ADO.NET Data provider. 4.5.0.0

The thing I find is that if the database is empty and I do select, then it goes into a failed state that I cannot resolve and have to recreate the database.

Procedure to reproduce:
Run the program, the program will pass con.Open and throw exception on the cmd.ExecuteScalar and the exception says table unknown. I.e. an expected exception.
Re-run the program, now the con.Open will throw an exception with the information: internal Firebird consistency check (cannot find tip page (165), file: tra.cpp line: 2369
If I try to re-run the program again the same exception happen on the con.Open statement. I cannot get pass this and have to recreate the database. I.e. the database in failed state.

New test run.
I run the program but this time execute the create table statement. No exception.
Re-run the program but with the select statement on a table that do not exist. Program will pass con.Open and throw exception on the cmd.ExecuteScalar and the exception says table unknown. I.e. an expected exception.
I can now re-run the program several times and the con.Open will always work and I get the expected exception of table unknown.

It seems that if I do a Select on at table on an empty database then this error happen, otherwise not.

Was not sure to report this as blocker, but it is a blocker for me as I cannot use Firebird with such a error in a production environment.

*************************************************************
class ConnectionInformation
<
public ConnectionInformation()
<
this.User = «SYSDBA»;
this.Password = «masterkey»;
this.ServerType = FbServerType.Embedded;
this.DatabaseFileName = «TaragonTrader.fdb»;
this.CharacterSet = «UTF8»;
this.ClientLibraryPath = @»fbembed.dll»;
this.Dialect = 3;

Below you will find the code for the connection information object that the test program.

This done in Visual Studio 2013, Windows 8.1, Firebird 2.5.4 and Firebird http://ADO.NET Data provider. 4.5.0.0

The thing I find is that if the database is empty and I do select, then it goes into a failed state that I cannot resolve and have to recreate the database.

Procedure to reproduce:
Run the program, the program will pass con.Open and throw exception on the cmd.ExecuteScalar and the exception says table unknown. I.e. an expected exception.
Re-run the program, now the con.Open will throw an exception with the information: internal Firebird consistency check (cannot find tip page (165), file: tra.cpp line: 2369
If I try to re-run the program again the same exception happen on the con.Open statement. I cannot get pass this and have to recreate the database. I.e. the database in failed state.

New test run.
I run the program but this time execute the create table statement. No exception.
Re-run the program but with the select statement on a table that do not exist. Program will pass con.Open and throw exception on the cmd.ExecuteScalar and the exception says table unknown. I.e. an expected exception.
I can now re-run the program several times and the con.Open will always work and I get the expected exception of table unknown.

It seems that if I do a Select on at table on an empty database then this error happen, otherwise not.

Was not sure to report this as blocker, but it is a blocker for me as I cannot use Firebird with such a error in a production environment.

[In next time, please, create compact example]

>>> Win7 x64 ();
throw ex;
>
>
catch(Exception exc)
<
Console.WriteLine(«ERROR: <0>— <1>«,
exc.Source,
exc.Message);
>
>//Main
>;//class Program

—————-
With other http://ADO.NET provider — no any problems also 🙂

I think, your problem in «unhandled» exception.

Unhandled Exception: FirebirdSql.Data.FirebirdClient.FbException: Dynamic SQL Error
SQL error code = -204
Table unknown
QUOTEDATAPROVIDER2
At line 1, column 22 —> FirebirdSql.Data.Common.IscException: Dynamic SQL Error
SQL error code = -204
Table unknown
QUOTEDATAPROVIDER2
At line 1, column 22
at FirebirdSql.Data.Client.Native.FesDatabase.ParseStatusVector(IntPtr[] statusVector) in c:UsersJiriDocumentsdevelNETProviderworkingNETProvidersrcFirebirdSql.Data.FirebirdClientClientNativeFesDa
tabase.cs:line 420
at FirebirdSql.Data.Client.Native.FesStatement.Prepare(String commandText) in c:UsersJiriDocumentsdevelNETProviderworkingNETProvidersrcFirebirdSql.Data.FirebirdClientClientNativeFesStatement.cs:l
ine 308
at FirebirdSql.Data.FirebirdClient.FbCommand.Prepare(Boolean returnsSet) in c:UsersJiriDocumentsdevelNETProviderworkingNETProvidersrcFirebirdSql.Data.FirebirdClientFirebirdClientFbCommand.cs:line
1187
at FirebirdSql.Data.FirebirdClient.FbCommand.ExecuteCommand(CommandBehavior behavior, Boolean returnsSet) in c:UsersJiriDocumentsdevelNETProviderworkingNETProvidersrcFirebirdSql.Data.FirebirdClient
FirebirdClientFbCommand.cs:line 1201
at FirebirdSql.Data.FirebirdClient.FbCommand.ExecuteScalar() in c:UsersJiriDocumentsdevelNETProviderworkingNETProvidersrcFirebirdSql.Data.FirebirdClientFirebirdClientFbCommand.cs:line 595
— End of inner exception stack trace —
at Program.Main(String[] args) in d:UsersDimaTemp2015_04_04__testConsoleApplication2__fbProgram.cs:line 63

Unhandled Exception: FirebirdSql.Data.FirebirdClient.FbException: internal Firebird consistency check (Internal error code (165), file: tra.cpp line: 2369) —> FirebirdSql.Data.Common.IscException: internal Fi
rebird consistency check (Internal error code (165), file: tra.cpp line: 2369)
at FirebirdSql.Data.Client.Native.FesDatabase.ParseStatusVector(IntPtr[] statusVector) in c:UsersJiriDocumentsdevelNETProviderworkingNETProvidersrcFirebirdSql.Data.FirebirdClientClientNativeFesDa
tabase.cs:line 420
at FirebirdSql.Data.Client.Native.FesDatabase.Attach(DatabaseParameterBuffer dpb, String dataSource, Int32 port, String database) in c:UsersJiriDocumentsdevelNETProviderworkingNETProvidersrcFirebird
Sql.Data.FirebirdClientClientNativeFesDatabase.cs:line 291
at FirebirdSql.Data.FirebirdClient.FbConnectionInternal.Connect() in c:UsersJiriDocumentsdevelNETProviderworkingNETProvidersrcFirebirdSql.Data.FirebirdClientFirebirdClientFbConnectionInternal.cs:l
ine 191
— End of inner exception stack trace —
at Program.Main(String[] args) in d:UsersDimaTemp2015_04_04__testConsoleApplication2__fbProgram.cs:line 63

Unhandled Exception: lcpi.data.oledb.OleDbException: 1. [LCPI.IBProvider.3] Prepare SQL statement failed.
Dynamic SQL Error
SQL error code = -204
Table unknown
QUOTEDATAPROVIDER2
At line 1, column 22

The COM error code: DB_E_NOTABLE. SQL State: «42S02». Native DBMS Error Code: 335544580.
———————————
2. [lcpi.data.oledb.OleDbCommand] Prepare of command has been finished with errors.

The COM error code: DB_E_NOTABLE.
at Program.Main(String[] args) in d:UsersDimaTemp2015_04_04__testConsoleApplication1Program.cs:line 62

Unhandled Exception: lcpi.data.oledb.OleDbException: 1. [LCPI.IBProvider.3] Prepare SQL statement failed.
Dynamic SQL Error
SQL error code = -204
Table unknown
QUOTEDATAPROVIDER2
At line 1, column 22

The COM error code: DB_E_NOTABLE. SQL State: «42S02». Native DBMS Error Code: 335544580.
———————————
2. [lcpi.data.oledb.OleDbCommand] Prepare of command has been finished with errors.

The COM error code: DB_E_NOTABLE.
at Program.Main(String[] args) in d:UsersDimaTemp2015_04_04__testConsoleApplication1Program.cs:line 62

class Program
<
static void Main(string[] args)
<
//try
<
System.Threading.Thread.CurrentThread.CurrentUICulture
=new System.Globalization.CultureInfo(«EN»);

var strBuilder = new OleDbConnectionStringBuilder();

strBuilder.Provider=»LCPI.IBProvider.3″; // 3.23.0.17515
strBuilder.UserID = «SYSDBA»;
strBuilder.Password = «masterkey»;
strBuilder.IBProvider.ctype = «UTF8»;

strBuilder.IBProvider.auto_commit=true;
strBuilder.Location = @»d:databaseTaragonTrader.fdb»;

var con=new OleDbConnection(strBuilder.ConnectionString);

try
<
if (File.Exists(strBuilder.Location))
<
Console.WriteLine(«Open»);

>
catch (Exception ex)
<
throw ex;
>

string sqlStatement = «Select Count(*) From QuoteDataProvider2»;

Источник

Submitted by: julian bui (jbu311)

Related to a bug found in the bug tracker. It looks like nobody did anything with that one because they didn’t have queries. I was able to duplicate the bug and here are the queries I used. Fields are censored for privacy reasons.

//NEXT THREE LINES EXECUTE WITHOUT ERRORS
String createTableQueryString = «CREATE TABLE MY_TABLE (aaaSMALLINT, bbbBIGINT, cccSMALLINT, ddd DOUBLE PRECISION, eee CHAR(16));»;
PreparedStatement ps = conn.prepareStatement(createTableQueryString);
ps.execute();

//NEXT FEWLINES PRODUCE ERROR:
try {
dataInsertPs = conn.prepareStatement(«INSERT INTO MY_TABLE (aaa, bbb, ccc, ddd, eee) VALUES (?, ?, ?, ?, ? )»);
} catch (SQLException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, «Could not create prepared statement», ex);
}

ERROR:
databaseURL = jdbc:firebirdsql:embedded:V:TempDB.FDB
Oct 22, 2008 1:24:06 PM Main createPreparedStatement
SEVERE: Could not create prepared statement
org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -204
Table unknown
MY_TABLE
At line 1, column 13
at org.firebirdsql.jdbc.AbstractPreparedStatement.<init>(AbstractPreparedStatement.java:127)
at org.firebirdsql.jdbc.FBPreparedStatement.<init>(FBPreparedStatement.java:41)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.firebirdsql.jdbc.FBStatementFactory.createPreparedStatement(FBStatementFactory.java:90)
at org.firebirdsql.jdbc.AbstractConnection.prepareStatement(AbstractConnection.java:869)
at org.firebirdsql.jdbc.AbstractConnection.prepareStatement(AbstractConnection.java:824)
at org.firebirdsql.jdbc.AbstractConnection.prepareStatement(AbstractConnection.java:817)
at org.firebirdsql.jdbc.AbstractConnection.prepareStatement(AbstractConnection.java:293)
at Main.createPreparedStatement(Main.java:101)
at Main.main(Main.java:189)

NewZ

14 / 14 / 2

Регистрация: 01.09.2010

Сообщений: 287

1

21.09.2011, 18:03. Показов 14085. Ответов 5

Метки нет (Все метки)


Не пойму при поптытке установить свойство PersonIBQuery.Active := True
выдает такую ошибку (рис.1).
В PersonIBQuery типа TIBQuery такой запрос:

SQL
1
SELECT * FROM Person

Структура БД и типы полей (рис.2).

Посоветуйте в чем может быть дело ???

PS. FireBird 2.5 SuperServer.

Миниатюры

SQL Error Code -204
 

SQL Error Code -204
 

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

21.09.2011, 18:03

5

912 / 877 / 62

Регистрация: 06.01.2010

Сообщений: 2,367

Записей в блоге: 6

21.09.2011, 18:17

2

1) проверить, что в Delphi-проекте соединение устанавливается с той же самой БД, что и в IBExpert’е (localhost:c:tempUnidance.fdb)
2) Удостовериться, что имя таблицы в IBExpert’е создано без двойных кавычек. Проще всего заглянуть на закладку «DDL»



1



14 / 14 / 2

Регистрация: 01.09.2010

Сообщений: 287

21.09.2011, 19:06

 [ТС]

3

Цитата
Сообщение от arni
Посмотреть сообщение

2) Удостовериться, что имя таблицы в IBExpert’е создано без двойных кавычек.

С двойными кавычками.
Что делать ? Как исправлять ? и почему ругается на кавычки ?



0



arni

912 / 877 / 62

Регистрация: 06.01.2010

Сообщений: 2,367

Записей в блоге: 6

21.09.2011, 19:27

4

заковыченные при создании идентификаторы придется использовать в запросах также в заковыченном состоянии и с точным соблюдением регистра.
К сожалению таблицы не переименовываются. Поэтому если пересоздать таблицу и перезалить в неё данные не вариант, пишите так:

SQL
1
SELECT * FROM "Person"



1



14 / 14 / 2

Регистрация: 01.09.2010

Сообщений: 287

21.09.2011, 20:48

 [ТС]

5

Цитата
Сообщение от arni
Посмотреть сообщение

К сожалению таблицы не переименовываются

А если я пересоздам таблицу, то как мне указать IBExpert’у, чтобы создавал без кавычек ?



0



912 / 877 / 62

Регистрация: 06.01.2010

Сообщений: 2,367

Записей в блоге: 6

21.09.2011, 21:07

6

точно не помню где это настраивается.
попробуй для начала поднять в св-вах базы «Всегда приводить имена объектов к верхнему регистру»



1



Различные реализации доступа к данным часто объединяют пересылку на сервер единичного изменения, добавления или удаления с немедленным COMMIT RETAIN В механизм, дублирующий «автоподтверждение». Общим для уровней интерфейса является реализация возможности автоподтверждения для «молчаливого» управления транзакцией, запуская транзакцию невидимо для программиста в ситуациях, когда написанный программистом код пытается передавать оператор без предварительного старта транзакции.

Явное управление транзакциями стоит дополнительных усилий, особенно если вы применяете продукт, использующий такие гибкие средства, которые предоставляет Firebird. В загруженном работой окружении вариант COMMIT RETAIN может сократить время выполнения и ресурсы, однако он имеет некоторые серьезные недостатки.

* Транзакция SNAPSHOT продолжает хранить первоначальный образ базы данных, что означает, что пользователь не видит подтвержденных результатов других транзакций, которые ожидали подтверждения при старте текущей транзакции.

* Пока та же транзакция продолжает выполнять подтверждение в варианте RETAIN, ресурсы, используемые на сервере, не освобождаются, что приводит к чрезмерному росту ресурсов памяти, потребляемых TSB. Этот рост сильно ухудшает производительность, в конечном счете «замораживая» сервер, и при неблагоприятных условиях операционной системы даже может привести к краху системы.

* Никакие старые версии записей, ставшие устаревшими в результате операций, подтвержденных в транзакциях COMMIT RETAIN, не могут быть включены в сборку мусора, т. к. исходная транзакция никогда не выполняет «жесткого подтверждения».

Оператор ROLLBACK

Как и COMMIT, оператор ROLLBACK освобождает ресурсы на сервере и завершает физический контекст транзакции. При этом вид состояния базы данных в приложении возвращается к тому виду, как если бы эта транзакция никогда не стартовала. В отличие от COMMIT данный оператор никогда не завершается с ошибкой.

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

RollbackRetaining

SQL в Firebird не реализует синтаксис RETAIN В ROLLBACK так же, как это делается в COMMIT. При этом похожий механизм клонирования реализован в функции API isc_roiiback_retaining(). Она восстанавливает для приложения вид базы данных в то состояние, которое было, когда транзакция получила дескриптор или, в случае транзакции READ COMMITTED, в то состояние, которое было при последнем вызове

isc_roiiback_retaining(). Выделенные для транзакции системные ресурсы не освобождаются, курсоры сохраняются.

ROLLBACK RETAIN имеет те же самые ловушки, что и COMMIT RETAIN — и даже больше. Поскольку отдельные вызовы откатов производятся в ответ на исключение некоторого вида, сохранение контекста транзакции также сохранит и причины исключения. ROLLBACK RETAIN не должен использоваться в тех случаях, если существует шанс, что ваш последующий код обработки исключения не найдет и не исправит наследуемое исключение. Любые последующие ошибки ROLLBACK RETAIN должны обрабатываться с полным откатом транзакции для освобождения ресурсов и устранения проблемы.

Диагностирование исключений

Основные причины возникновения ошибок при пересылке данных или подтверждении работы включают:

* конфликты блокировок;

* «плохие данные», полученные от интерфейса пользователя: арифметическое переполнение, деление на ноль в выражениях, пустые значения в полях, не допускающих пустых значений, несоответствие набора символов и т.д.;

* «хорошие данные», которые нарушают ограничение CHECK или другие проверки;

* нарушения первичного или внешнего ключей;

* и другие!

Firebird распознает большое количество различных (более того, поразительных!) исключений и возвращает код ошибки для их идентификации на двух уровнях:

* на высоком уровне существует переменная SQLCODE, определенная (более или менее, с ударением на «менее») в стандарте SQL;

* на более детальном уровне присутствует GDSCODE — индикатор большего размера, более точно определяющий тип исключений, которые сгруппированы на предыдущем уровне в типе SQLCODE.

SQLCODE

В табл. 27.2 представлены значения стандартов SQL-89 и SQL-92, определенные для SQLCODE.

Таблица 27.2. Значения SQLCODE

SQLCODE

Сообщение

Интерпретация

0

SUCCESS

Операция завершилась успешно

1-99

SQLWARNING

Предупреждающее или информационное сообщение сервера

100

NOT FOUND

Была запрошена операция, для которой не было найдено строк. Это не ошибка — код часто просто сообщает о том, что определено условие «конец файла» или «конец курсора» или что не найдено соответствующих значений

<0

SQLERROR

Указывает, что оператор SQL не был завершен. Числа находятся в диапазоне от -1 до -999

Описание отрицательных значений SQLCODE для конкретных ошибок не содержится в стандартах. Отрицательные значения SQLCODE в Firebird являются довольно обобщенными, они представлены группами, которые в значительной степени получены случайно и очень часто своим составом изумляют. Например, можно установить, что значение SQLCODE -204 означает «нечто неизвестное», однако сам код ничего не говорит, что именно неизвестно.

GDSCODE

Второй уровень, GDSCODE, предоставляет гораздо больше возможностей определения исключений. Каждый код GDSCODE является знаковым целым, константы которого представлены в iberror.h (или в interbase.msg, если вы используете версию 1.0.x)[105]. Как правило, сообщение GDSCODE достаточно точно указывает, что произошло[106]. В Firebird 1.5 значительно улучшена информация, передаваемая в сообщениях. Тем не менее GDSCODE предоставляет для приложений наиболее полезный механизм диагностики; вы можете преобразовать константы в пользовательские сообщения в вашем модуле на включающем языке для использования в обработчиках исключений.

Получение исключений

В следующем примере приложение делает попытку добавить данные в таблицу, которая не существует:

INSERT INTO NON_EXISTENT (TEST)

VALUES (‘ABCDEF’);

Следующая информация об ошибке возвращается приложению (утилита администратора IB SQL в этом случае):

ISC ERROR CODE:335544569 <- GDSCODE

Dynamic SQL Error <- corresponding text from firebird.msg

SQL error code = -204 <- SQLCODE

Table unknown <- corresponding text from firebird,msg

NON_EXI STENT

Откуда приложение получает коды ошибок и сообщения? Ответ можно найти в векторе состояния ошибки (error status vector), в массиве, который передается в качестве параметра в большинство функций API. Эти функции возвращают состояние и коды ошибок клиенту вместе с соответствующими строками из файла сообщений Firebird[107]. API также предоставляет клиентским приложениям служебные функции для чтения содержимого векторов состояния ошибок в локальных буферах. Обработчики ошибок могут затем анализировать содержимое этих буферов и использовать полученную информацию для принятия решения, как поступить с исключением, а также выдать пользователю дружественное сообщение.

iberror.h

Заголовочный файл iberror.h в вашем каталоге /include содержит объявления, каждое из которых связано с SQLCODE и GDSCODE через символическую константу. Например, вот объявления констант для двух кодов ошибок из предыдущего примера:

вернуться

105

Неанглийские версии файла сообщений не были доступны во время написания данной книги. Готовятся проекты трансляции. Если вас интересует локализованный файл сообщений, обратитесь к спискам сообщества Firebird. Сообщите, что вы заинтересованы в участии в проектах локализации!

вернуться

106

Существует несколько неприятных исключений из этого правила. Например, ISC ERROR CODE: 335544321 «Arithmetic exception, numeric overflow, or string truncation» (Арифметическое исключение, числовое переполнение или усечение строки) объединяет такой широкий диапазон возможностей, что оно обычно вызывает состояние изумления даже у программиста, который допустил возможность появления такого исключения.

вернуться

107

Если клиентская библиотека удаленного клиента находит локальную копию файла сообщений в известном «корневом» каталоге, Firebird 1.5 будет использовать именно ее и перекроет этот файл в каталоге сервера RootDirectory. Поскольку до сих пор не решено, является ли это желательной возможностью, то может быть разумным устранить зависимость от такого поведения в интересах будущей защиты. В любом случае файловые системы рабочих станций являются весьма уязвимыми при неправильном поведении пользователя.

  • Remove From My Forums
  • Вопрос

  • Доброго времени суток,

    необходимо забрать данные из БД Firebird  в БД MS SQL .

    На тестовый ПК с MS SQL 2008 R2, установил Firebird Superserver 2.5 (32-bit), драйвер ODBC Firebird 32-bit.

    Настроил источник данных ODBC, тест соединения к БД Firebird проходит успешно. Добавил Linked Server используя созданный источник данных.

    Могу просмотреть список таблиц в БД Firebird, но все запросы отваливаются с различными ошибками. 

    Например:

    OLE DB provider «MSDASQL» for linked server «FB» returned message «[ODBC Firebird Driver][Firebird]Dynamic SQL Error
    SQL error code = -204
    Table unknown
    DCFUELS
    At line 1, column 15″.
    Msg 7306, Level 16, State 2, Line 3
    Cannot open the table «dcFuels» from OLE DB provider «MSDASQL» for linked server «FB». 

    Может у кого есть опыт в решение подобных задач?

    P.S. Вытащить данные смог только через OpenRowSet(причем используя тот же провайдер «MSDASQL»). Но этот тип запроса не устраивает и есть проблемы с кодировкой.

    • Изменено

      11 октября 2016 г. 4:13

Ответы

  • Решил задачу таким образом: 

    DECLARE @DatetimePoint VARCHAR(20);
    DECLARE @LinkedServer VARCHAR(2000);
    DECLARE @Query VARCHAR(2000);
    DECLARE @TSQL VARCHAR(8000);
    
    SET @DatetimePoint = '2016-09-15 12:00';
    
    SET @LinkedServer = 'Driver={Firebird/InterBase(r) driver};
    					Password=masterkey;
    					Persist Security Info=True;
    					User ID=SYSDBA;
    					Uid=SYSDBA;
    					Pwd=masterkey; 
    					CHARSET=UTF8;
    					DbName=E:DatabaseTOPAZAZS.FDB';
    					
    SET @Query = 'SELECT * FROM "sysEvents" WHERE "DateTime" >= CAST(''''' + @DatetimePoint + ''''' AS TIMESTAMP)';
    
    SET @TSQL = 'SELECT * FROM OPENROWSET(''MSDASQL'', ''' + @LinkedServer + ''', ''' + @Query + ''')';
    
    EXEC (@TSQL)

    В целом это решение. Запрос выполняется, проблем с кодировкой нет.

    Но все равно остается вопрос почему не выполняется запрос к созданному linked server, который использует источник данных ODBC.

    P.S. Строка запроса выполняемая к БД Firebird (@Query), должна использовать синтаксис Firebird.

    • Изменено
      wUI
      11 октября 2016 г. 5:42
      уточнение
    • Помечено в качестве ответа
      wUI
      11 октября 2016 г. 11:14

Модераторы: kdv, Alexey Kovyazin

Konstantin

Сообщения: 37
Зарегистрирован: 27 окт 2004, 06:01

Table unknown. RDB$DATABASE.

через IBExpert дал Одной из ролей все права на чтение таблиц.
После этого к базе могу подключится только через SYSDBA.
Пользователи все подключаются через Роли.

если подключаться пользователем с ролью вылетает ошибка

Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Table unknown.
RDB$DATABASE.
At line 2, column 19.

Что делать?? в чем проблема???


kdv

Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение

kdv » 17 июн 2005, 10:36

нажал не ту нкопку, и создались не те права. см. в rdb$user_privileges



Konstantin

Сообщения: 37
Зарегистрирован: 27 окт 2004, 06:01

Сообщение

Konstantin » 17 июн 2005, 13:42

Удалил Роль из базы.
почистил все упоминания этой роли в rdb$user_privileges

не помогает.


Merlin

Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение

Merlin » 17 июн 2005, 14:05

Сделай backup-restore и больше не балуйся с правами на системные таблицы.


Konstantin

Сообщения: 37
Зарегистрирован: 27 окт 2004, 06:01

Сообщение

Konstantin » 20 июн 2005, 08:43

Да не трогал я системные таблицы.

Роли права назначал через IBExpert .

Это уже не первый раз. такое а бакап и ресторе 4Гига делать каждый раз. долговато.


Merlin

Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение

Merlin » 20 июн 2005, 12:54

Konstantin писал(а):Да не трогал я системные таблицы.

Трогал-трогал. Чудес не бывает.

Konstantin писал(а):
Роли права назначал через IBExpert .

Вот тут руки и не помыл. То ли сам назначил права на доступ к системеным таблицам, то ли Экспертовский автогрант помог.


Konstantin

Сообщения: 37
Зарегистрирован: 27 окт 2004, 06:01

Сообщение

Konstantin » 20 июн 2005, 13:08

Merlin писал(а): то ли Экспертовский автогрант помог.

А вот этим часто пользуемся.

Так как лечить то??? 4Гига сильно долго бакап ресторе делать.

Причем на убитой базе — удаляли все права кроме Sysdbа

назначали снова — через Эксперт все рано не коннктится.

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


Merlin

Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение

Merlin » 20 июн 2005, 13:48

select * from rdb$user_privileges where rdb$relation_name starting ‘RDB$’

По уму должен получить не больше 6 записей с доступом к RDB$ROLES — 5 на все права создателя базы (если он не SYSDBA) и 1 на чтение PUBLIC. Если что вылезет ещё — revoke. По идее должно оклематься, но я бы советовал всё-таки b/r — там остаются лишние записи в RDB$SECURITY_CLASSES, чем может аукнуться впоследствии — не знаю.


Понравилась статья? Поделить с друзьями:
  • Spring json error response
  • Sql error code 18456
  • Sql error code 1215 cannot add foreign key constraint
  • Sql error code 1175
  • Sql error code 1052