Beruflich Dokumente
Kultur Dokumente
ii
The Firebird Book (Second Edition): A Reference for Database Developers
iii
AUTHORS FOREWORD
This, the second edition of The Firebird Book, has been gestating for more than seven
years, since the first edition in August, 2004. The first books milestone was Firebird 1.5. Its
objective was to to provide an up-to-date working reference for developers, whether
coming to Firebird from another database management system or moving into it with past
experience in its closed source cousin, InterBase.
In the intervening years, Firebird has evolved through three further major versions: 2.0, 2.1
and 2.5. At the time of this writing, all three are still under maintenance and the rearchitected version 3.0 is in alpha development. Maintenance of version 1.5 ceased in 2009.
The energy and dedication of Firebirds development team continue to be a source of
wonder and inspiration to me and, Im sure, to anyone else who works with Firebird. The
polyglot Core teamDmitry Yemanov, Vlad Khorsun, Alex Peshkov and Adriano dos
Santos Fernandesworks closely and tirelessly under Dmitrys chieftainship. Pavel Cisar
and Philippe Makowski perform quality assurance testing and Claudio Valderrama is
responsible for scrutinising incoming code changes. Claudios hand is often seen in
improvements to the command-line tools, as well.
Because Firebird is distributed free, in all senses of the word, it produces no revenue to pay
salaries to the code workers. Except for the QA people, these volunteers depend on
Firebird Foundation grants to supplement their incomes to make space for their Firebird
work.
The Firebird Foundation is funded by donations, cash sponsorships and membership
subscriptions from individuals and companies that perceive and acknowledge the benefits
of using Firebird and keeping it under active development. You can view the current list of
sponsors at http://www.firebirdsql.org/en/sponsors/. Bless em all!
Some sponsors contribute much more than cash. IBPhoenix, for example, contributes the
manpower for QA, binary builds and basic documentation. Neither this book nor its
predecessor would have come to fruition without IBPhoenix funding. Broadview Software
hosts the issue tracker, pre-release and build servers while IBSurgeon funds the hosting and
development of the Firebird web site at www.firebirdsql.org.
Amongst the volunteers who contribute their time and expertise to the Firebird Project
without grants I must name Paul Vinkenoog, who has been almost single-handedly
responsible for filling the free documentation gap between the legacy InterBase manuals
and the release notes that are distributed with the binary kits. It is a vast and ongoing task
that is often thankless. At the time of writing this, Paul is working with Dmitry Yemanov to
produce comprehensive on-line SQL documentation that will not be inhibited by the
copyright issues that prohibit reuse of the legacy InterBase material.
Under the Firebird Project umbrella, volunteers also develop and maintain several of the
drivers and language interfaces for FirebirdJaybird (for Java), the Firebird .NET
providers, the ODBC driver and the interfaces for PHP and Python.
If you are coming to Firebird as a newcomer, welcome! I wish you a long and happy
experience with our software. To you and to those devotees who are freshening up your
Firebird experience, I wish you great satisfaction from your use of this Second Edition of
The Firebird Book.
Helen Borrie, author
December 2011
iv
This page is intentionally left blank.
vi
Table of Contents
Contents
Contents vii
2 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
System Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Server Memory (All Platforms) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Installation Drives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Minimum Machine Specifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Operating System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
How to Get an Installation Kit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Kit Contents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Installing a Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The FIREBIRD Variable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Finalise your Server Choice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Linux and Many Other POSIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MacOSX/Darwin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Other Host Platforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Testing Your Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Network Protocol. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Checking That the Firebird Server Is Running. . . . . . . . . . . . . . . . . . . . . .
The Client Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Performing a Client-Only Install . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Installing an Embedded Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Uninstalling Firebird. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MacOSX/Darwin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Other Things You Need to Know . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Default User Name and Password . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
23
23
24
24
25
27
27
29
29
29
30
33
36
37
37
37
38
40
41
45
46
46
47
48
48
48
51
51
51
52
52
53
54
54
viii Contents
55
56
57
57
58
59
59
62
4 Operating Basics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Looking for a User Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Running Firebird on POSIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Superserver and Superclassic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Classic server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Running Firebird on Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Servers and the Guardian. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Running as a service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Running as an application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Running Firebird on MacOSX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Super* Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Classic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Mixed Platforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Database aliasing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
63
63
63
64
66
67
67
67
68
70
70
70
70
71
73
73
73
74
74
76
5 Migration Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Version Lineage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Firebird 1.0
Firebird 1.5
Firebird 2.0
Firebird 2.1
...................................................
...................................................
...................................................
...................................................
79
80
80
81
Contents ix
Firebird 2.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Backward Compatibility. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Preparing to Migrate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Major Releases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sub-releases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dialect 1 Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Back Up! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Migration Tasks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Get the Latest Sub-release! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The FIREBIRD Variable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Platform Issues. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Security Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Metadata Repair . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Application Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Migration Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
82
83
83
83
85
87
88
88
88
89
89
90
93
95
x Contents
7 Number Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Numerical Limits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Points About Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Operations on Number Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Integer Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Notation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Integer/integer division . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Fixed Decimal (Scaled) Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Internal Storage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Special restrictions in static SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Behaviour of fixed types in operations . . . . . . . . . . . . . . . . . . . . . . . . . . .
Floating Point Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Supported Float Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Arithmetic mixing fixed and floating-point types. . . . . . . . . . . . . . . . . . .
111
111
112
112
112
112
113
114
115
116
117
117
120
121
121
123
123
123
124
124
125
125
128
129
130
130
131
132
133
136
136
138
138
Contents xi
9 Character Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
String Essentials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
String Delimiter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Concatenation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Escape Characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
String Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Limitations with Character Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Fixed-length Character Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Variable-length Character Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Character Sets and Collation Sequences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Character Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Client Character Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Firebird character sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Special Character Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Transliteration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Collation Sequence. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Adding an Alias for a Character Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Custom character sets and collations . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Metadata Text Conversion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
141
141
142
142
142
143
144
145
145
146
147
148
149
152
154
155
159
160
164
167
167
168
168
169
169
170
171
173
173
173
173
174
175
175
176
xii Contents
11 Domains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Benefits of Using Domains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating a Domain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using a Domain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Domains in Column Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Domains in PSQL Variable Declarations . . . . . . . . . . . . . . . . . . . . . . . . .
Using Domains with CAST(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Where domains won't work. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Defining a BOOLEAN Domain. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Changing a Domain Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dropping a Domain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
177
177
178
182
182
184
184
185
185
185
187
191
191
192
193
197
197
198
198
198
200
201
201
202
202
202
203
204
204
204
205
205
205
Contents xiii
xiv Contents
15 Tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
About Firebird Physical Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Structural descriptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating Tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table ownership and privileges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
CREATE TABLE statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Constraints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Scope of Constraints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Integrity Constraints. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The referential constraint. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Named constraints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The NOT NULL Constraint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The PRIMARY KEY constraint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The UNIQUE constraint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
CHECK constraints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using External Files as Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Restrictions and recommendations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Converting external tables to internal tables. . . . . . . . . . . . . . . . . . . . . . .
Dropped database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Altering Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Preparing to use ALTER TABLE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Altering Columns in a Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Removing (Dropping) a Table. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The RECREATE TABLE statement . . . . . . . . . . . . . . . . . . . . . . . . . . .
Temporary Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Global Temporary Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Temporary Storage for Older Versions. . . . . . . . . . . . . . . . . . . . . . . . . . .
Tree Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
235
235
235
236
236
236
241
241
241
241
242
242
243
248
249
251
252
253
255
256
256
256
256
261
261
261
262
263
264
16 Indexes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Limits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Automatic vs User-defined Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Importing legacy indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Directional indexes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
265
265
266
266
266
Contents xv
Query plans. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
How Indexes Can Help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sorting and grouping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Joins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Comparisons. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
What to Index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
When to index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using CREATE INDEX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Mandatory elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optional elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Multi-column Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
OR predicates in queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Search criteria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Inspecting Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Making an Index Inactive. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Housekeeping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Index is in use error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Altering the structure of an index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dropping an Index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
267
267
267
268
268
268
269
269
269
270
272
272
273
273
273
273
274
274
274
17 Referential Integrity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terminology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The FOREIGN KEY Constraint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Implementing the constraint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Action triggers to vary integrity rules . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Interaction of Constraints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Custom Action Triggers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Lookup Tables and Your Data Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The REFERENCES Privilege. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Handling Other Forms of Relationship . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
One-to-one relationship. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Many-to-many relationship . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Self-Referencing Relationship . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Mandatory relationships. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
275
275
276
276
278
279
280
280
282
282
282
283
286
287
xvi Contents
291
291
292
292
292
293
294
294
295
296
19 DML Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The SELECT Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Clauses in a SELECT statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
INSERT and UPDATE Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
INSERT INTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
UPDATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
UPDATE OR INSERT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MERGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The DELETE Statement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EXECUTE Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Batch operations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Queries That Execute Server-side Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Executable procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Selectable procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DML operations and state-changing events . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Referential integrity action clauses. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Custom triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Query Plans and the Optimizer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Plans and the Firebird query optimizer . . . . . . . . . . . . . . . . . . . . . . . . . . .
297
297
298
307
307
311
315
316
318
318
318
320
321
321
321
322
322
322
323
323
Contents xvii
325
327
332
333
335
337
339
339
340
341
341
342
342
344
344
345
345
345
350
351
351
354
354
355
355
356
356
357
357
363
365
366
366
367
367
368
xviii Contents
String Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Function for Getting a Generator (Sequence) Value . . . . . . . . . . . . . . . .
Aggregating Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Functions for Setting and Getting Contextual Data. . . . . . . . . . . . . . . . .
External Functions (UDFs) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
369
371
372
373
376
381
381
382
382
382
382
383
384
384
387
390
391
393
393
395
395
396
396
396
397
398
399
399
400
401
401
401
403
403
403
Contents xix
Sort direction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
NULLS placement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The GROUP BY Clause . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The groupable field list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Aggregating expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The grouping item . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The HAVING sub-clause . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The COLLATE sub-clause . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using ORDER BY in a grouped query . . . . . . . . . . . . . . . . . . . . . . . . . .
Advanced grouping conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Aggregating Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
AVG( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SUM( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MAX( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MIN( ). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using COUNT( ) as an aggregating function . . . . . . . . . . . . . . . . . . . . .
The LIST( ) function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
406
406
407
407
408
409
411
412
412
412
415
415
415
416
416
416
417
419
419
420
420
421
425
425
426
429
430
430
431
432
433
434
435
435
436
440
xx Contents
443
443
443
444
445
446
450
451
454
463
470
470
470
471
474
485
486
486
486
486
486
487
487
488
488
489
489
Contents xxi
Table-level locks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Inserts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Transaction Aging and Statistics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Transaction ID and age . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Interesting transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Background garbage collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Keeping the OIT and the OAT moving . . . . . . . . . . . . . . . . . . . . . . . . .
Transaction statistics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
490
491
491
491
492
492
494
496
26 Configuring Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Anatomy of a Transaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Default Transaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Default settings. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
About Concurrency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Factors affecting concurrency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Isolation level . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Standard levels of isolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Locking Policy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
499
499
499
500
500
501
501
501
503
Access Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table Reservation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Uses for Table Reservation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Parameters for table reservation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Other Optional Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Record Versions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dependent rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Locking and Lock Conflicts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Timing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Pessimistic locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Lock conflicts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
504
505
505
506
507
507
508
508
508
508
509
511
511
512
512
512
xxii Contents
513
514
514
515
515
515
517
517
518
520
521
522
522
523
523
524
524
524
525
528
528
528
529
529
529
533
533
534
535
536
536
536
Contents xxiii
xxiv Contents
573
573
574
574
575
577
601
601
604
604
605
605
607
30 Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Classes of Trigger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table-level Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Database Triggers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DDL Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
609
609
609
610
610
Contents xxv
xxvi Contents
639
639
639
640
640
642
642
644
647
648
649
649
649
650
651
652
653
657
657
657
658
658
659
660
662
663
664
664
665
665
665
667
669
669
Contents xxvii
CompleteBooleanEvaluation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ConnectionTimeout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DatabaseAccess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DatabaseGrowthIncrement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DeadlockTimeout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DefaultDbCachePages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DummyPacketInterval . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
FileSystemCacheThreshold . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
FileSystemCacheSize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
GCPolicy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LegacyHash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LockAcquireSpins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LockHashSlots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LockGrantOrder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LockMemSize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LockSemCount . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LockSignal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MaxUserTraceLogSize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
OldColumnNaming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
OldSetClauseSemantics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Redirection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
RelaxedAliasChecking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
RemoteAuxPort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
RemoteBindAddress . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
RemoteFileOpenAbility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
RemoteServicePort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
RemoteServiceName . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
RootDirectory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TcpRemoteBufferSize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TcpNoNagle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TempBlockSize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TempCacheLimit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TempDirectories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
672
673
673
673
674
674
674
675
675
676
676
676
676
677
677
677
678
678
678
678
679
679
679
680
680
680
680
681
681
681
681
681
682
683
683
684
684
684
684
685
685
xxviii Contents
687
688
688
688
688
709
709
709
710
Contents xxix
Protect Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Platform-based protection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wire Security. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Web and Other n-Tier Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Use Dedicated Hosts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Establish Trustworthiness . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Firewalls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Server Multi-hop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Denial-of-Service Attacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Managing User Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Security Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Firebird Native Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Platform Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Privileged Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Entering User Credentials via SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The gsec Utility. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
710
710
714
714
714
714
715
715
715
716
716
717
717
719
720
722
37 Database-Level Security. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Default Security and Access. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Planning an Access Scheme. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Metadata Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SQL Privileges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
729
729
730
730
730
731
731
732
732
732
733
733
733
734
734
735
736
736
737
xxx Contents
737
737
738
738
739
740
741
742
742
742
743
Revoking Privileges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using REVOKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Security Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating a script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Installing perms directly from a procedure . . . . . . . . . . . . . . . . . . . . . . .
A Trick to Beat Idiot Users and Bad Guys . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
744
744
747
748
750
752
Contents xxxi
39 Backing Up Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
gbak or nBackup? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The gbak Utility. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
About gbak Backup Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
gbaks other talents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Database backup & restore rights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Running a Backup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Running a Restore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Restore switches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using gbak with the Firebird Services Manager . . . . . . . . . . . . . . . . . . . .
gbak Error Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Incremental Backup Tool (nBackup) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
About nBackup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Making Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Restoring from nBackup Files. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using the Freeze Utility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SQL Support for nBackup. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
nBackup command-line options summary . . . . . . . . . . . . . . . . . . . . . . . .
Database Shadowing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Benefits and limitations of shadowing . . . . . . . . . . . . . . . . . . . . . . . . . . .
Implementing shadowing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Replication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Warm Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
799
799
800
800
801
802
803
807
809
813
815
818
819
820
824
825
826
828
828
828
829
833
833
xxxii Contents
xxxiv Contents
Index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i
GLOSSARY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii
Contents xxxv