Commandment 5: Prefix Custom SQL Objects
Database Object Naming
For customizations, it is important that tables, stored procedures, user-defined functions, and views start with "USR_."
Tip: Starting with version 3.0, you can specify a default prefix for database artifacts when you install the SDK. For information about this option, log in to the SDK downloads page and view the installation instructions.
Triggers and check constraints should start with "TR_" and "CK_," respectively, and include the custom table name. Indexes should start with "IX_" and include the custom table name or Blackbaud production table. Prefixing database objects with "USR_" is key to avoid potential naming collisions with future features delivered as part of the product. Each catalog spec may include a number of database objects, but typically you are dealing with stored procedures, tables and user-defined functions. Per each database object, here is the general naming convention:
Database Object | Naming | Example |
---|---|---|
Table | USR_<TABLENAME> | USR_CONSTITUENTSPORT |
Stored Procedure | USR_USP_<SP NAME> | USR_USP_CONSTITUENTSPORT |
User-defined Function | USR_UFN_<FUNCTION NAME> | USR_UFN_CONSTITENTSPORT_GETLIST |
Trigger | TR_USR_<TABLENAME> | TR_USR_CONSTITUENTSPORT_UPDATE |
Check Constraint | CK_USR_<TABLENAME> | CK_USR_CONSTITUENTSPORT_VALIDSPORT |
View | USR_V_<VIEWNAME> | USR_V_CONSTITUENTSPORT |
Index | IX_USR_<TABLENAME>_<KEY COLUMN 1>_<KEY COLUMN 2>_<...> | IX_USR_FINANCIALTRANSACTION_BASEAMOUNT_DATE |
Tip: We also recommend that you include the "USR_" prefix on field names in batch extension specs. This avoids naming conflicts with existing fields in batch specs and with future fields that Blackbaud may add to batch specs. Starting with version 4.0, placeholder field names in batch extension specs include the "USR_" prefix by default. If your batch extension fields do not include the "USR_" prefix and Blackbaud adds fields with the same names, conflicts will occur and you will need to update the field names on the batch extension.
Names of all database objects (tables, functions, stored procedures, etc.) should be in upper-case.
In Transact-SQL statements, Transact-SQL keywords should always be lower-case.
When referenced in stored procedures, functions, etc., database objects should always be referenced using the database owner, typically dbo (i.e. select FIRSTNAME, KEYNAME, dbo.USP_CONSTITUENT_GETFULLNAME(ID) as FULLNAME from dbo.CONSTITUENT).
The individual database objects should be named according to these rules:
-
A table should be named according to the entity it represents, with no abbreviations if possible. (i.e. CONSTITUENT, PHONE).
-
A custom stored procedure name begins with USR_USP_, is followed by the name of the primary table it manipulates, and ends with a description of its functionality (i.e. USR_USP_FOODBANK_CREATE).
-
A user-defined function begins with USR_UFN_, is followed by the name of the primary table it accesses, and ends with a description of its functionality (i.e. USR_UFN_FOODBANK_GETFULLNAME).
-
A view name begins with USR_V_, is followed by the name of the primary table it accesses, and ends with a description of its functionality (i.e. USR_V_FOODBANK_TRANSACTIONCOUNT).
-
A statement containing a JOIN must use a fully qualified name for fields such as TABLENAME.FIELDNAME instead of FIELDNAME.
-
An index name begins with "IX_USR_," is followed by the name of the table, and ends with the columns that the index uses.
Note: For information about how to write custom indexes for Blackbaud production tables, see Custom Indexes
Specific Spec Naming
Certain catalog specs contain database objects that have additional naming conventions. The general database object naming convention applies, but keep the spec's naming convention as well.
Spec Type | Naming | Example |
---|---|---|
Add Data Form | USR_USP_DATAFORMTEMPLATE_ADD_<ENTITY> | USR_USP_DATAFORMTEMPLATE_ADD_CONSTITUENTSPORT |
Edit Data Form (Load) | USR_USP_DATAFORMTEMPLATE_EDITLOAD_<ENTITY> | USR_USP_DATAFORMTEMPLATE_EDITLOAD_CONSTITUENTSPORT |
Edit Data Form (Save) | USR_USP_DATAFORMTEMPLATE_EDIT_<ENTITY> | USR_USP_DATAFORMTEMPLATE_EDIT_CONSTITUENTSPORT |
View Data Form | USR_USP_DATAFORMTEMPLATE_VIEW_<ENTITY> | USR_USP_DATAFORMTEMPLATE_VIEW_CONSTITUENTSPORT |
Data List | USR_USP_DATALIST_<ENTITY> | USR_USP_DATALIST_CONSTITUENTSPORT |
Search List | USR_USP_SEARCH_<ENTITY> | USR_USP_SEARCH_CONSTITUENTSPORT |
Query | USR_V_QUERY_<ENTITY> | USR_V_QUERY_CONSTITUENTSPORT |
Smart Query | USR_UFN_SMARTYQUERY_<ENTITY> | USR_UFN_SMARTQUERY_CONSTITUENTSPORT |
Merge Task | USR_USP_MERGETASK_<ENTITY> | USR_USP_MERGETASK_CONSTITUENTSPORT |
Global Change | USR_USP_GLOBALCHANGE_<ENTITYACTION> | USR_USP_GLOBALCHANGE_ADDCONSTITUENTSPORT |
Smart Field | USR_USP_SMARTFIELD_<ENTITYACTION> | USR_USP_SMARTFIELD_CONSTITUENTSPORTCOUNT |
Simple Data List | USR_USP_SIMPLEDATALIST_<ENTITY> | USR_USP_SIMPLEDATALIST_SPORT |
Translation Function | USR_UFN_TRANSLATIONFUNCTION_<ENTITY> | USR_UFN_TRANSLATIONFUNCTION_SPORT |
Record Operation | USR_USP_<ENTITY>_<ACTION> | USR_USP_CONSTITUENTSPORT_DELETE |
Name Format Function | USR_UFN_NAMEFORMAT_<ENTITY> | USR_UFN_NAMEFORMAT_SPORTNICKNAME |
Country Address Format | USR_UFN_ADDRESSFORMAT_<COUNTRY/NAME> | USR_UFN_ADDRESSFORMAT_USCUSTOM |
Report (sp) | USR_USP_REPORT_<ENTITYACTION> | USR_USP_REPORT_CONSTITUENT_GETSPORTS |