Few people know about the INFORMATION_SCHEMA views that have been there since SQL-92.
Two funny things about that standard:
- Until the 1990’s, Digital Equipment Corporation was still heavily involved in SQL.
Back then Jim Melton from Digital Equipment Corporation (now at W3C, before that at Oracle and Sybase), was the editor of the SQL-92 standard.
Another Jim worked at DEC until 1981 with great influences on other relational databases too. - Of the four levels in the SQ-92, no database vendors have been certified higher than the “Entry Level”.
A few reasons I can imagine not many people know about the INFORMATION_SCHEMA:
- Not all relational database servers implement them, and of the ones that do implement them, not all versions implement all views.
That’s what this article is about; currently it lists only SQL Server 2000 and 2008 R2 (tried both) and PostgreSQL (verified docs), but I will update it as soon as I have run the script on other versions of SQL server and database vendors. - It is hard to find the official ISO standards in a public way, and ISO itself sometimes puts things online, and at other times wants money for it
I remember the Y2K preparation era where the ISO-8601 standard was freely available at http://www.iso.ch/markete/8601.pdf, soon after the Year 2000, the PDF got locked behind a payment engine.
ISO suffers from heavy link rot too, for instance the ISO 3166 country codes used to be at http://www.iso.org/iso/prods-services/iso3166ma, but are now at http://www.iso.org/iso/home/standards/country_codes.htm. What about HTTP 303 or 302 redirect here guys?
Since SQL-92, the INFORMATION_SCHEMA (and its twin DEFINITION_SCHEMA) have been extended. The last extension in 2008. Together they allow SQL databases to be self-describing (I think no vendor has attained that) and the structures queryable in a standard way
In fact that is the main purpose: these views in INFORMATION_SCHEMA are a very convenient standard way to query – in a vendor agnostic way – about tables, views, columns, etc.
The table below is based on (thanks to this Stack Overflow answer on INFORMATION_SCHEMA):
- the text version of the SQL-92 standard
- the text version of the SQL-92 Persistent Stored Modules standard
- PostgreSQL: Documentation: 9.1: The Information Schema.
- Information Schema Views (Transact-SQL).
- Lorenzo Alberton – Articles – Updated articles to extract META informations from databases
(who also wrote 4 nice articles on getting meta data from SQL Server, Oracle, InterBase/Firebird and PostgreSQL)
View | 7 | 2000 | 2005 | 2008 | 2008 R2 | 2012 | 9.1.4 |
MariaDB | SQL-92 | SQL:1999 | SQL:2003 | SQL:2006 | SQL:2008 | Notes |
ADMINISTRABLE_ROLE_AUTHORIZATIONS | ? | – | ? | ? | – | ? | + |
+ | – | |||||
APPLICABLE_ROLES | ? | – | ? | ? | – | ? | + |
+ | – | |||||
ASSERTIONS | ? | – | ? | ? | – | ? | ? | + | + | |||||
ATTRIBUTES | ? | – | ? | ? | – | ? | + |
+ | – | |||||
CHARACTER_SETS | ? | – | ? | ? | – | ? | + |
+ | + | |||||
CHECK_CONSTRAINTS | ? | + | ? | ? | + | ? | + |
+ | + | |||||
check_constraint_routine_usage | ? | – | ? | ? | – | ? | + |
– | – | |||||
COLLATIONS | ? | – | ? | ? | – | ? | + |
+ | + | |||||
collation_character_set_applicability | ? | – | ? | ? | – | ? | + |
– | – | |||||
COLUMNS | ? | + | ? | ? | + | ? | + |
+ | + | |||||
COLUMN_DOMAIN_USAGE | ? | + | ? | ? | + | ? | + |
+ | + | |||||
COLUMN_PRIVILEGES | ? | + | ? | ? | + | ? | + |
+ | + | |||||
COLUMN_USER_DEFINED_TYPE_USAGE | ? | – | ? | ? | – | ? | + column_udt_usage |
+ |
– | |||||
CONSTRAINT_COLUMN_USAGE | ? | + | ? | ? | + | ? | + |
+ | + | |||||
CONSTRAINT_TABLE_USAGE | ? | + | ? | ? | + | ? | + |
+ | + | |||||
data_type_privileges | ? | – | ? | ? | – | ? | + |
– | – | |||||
DIRECT_SUPERTABLES | ? | – | ? | ? | – | ? | – | + | – | |||||
DIRECT_SUPERTYPES | ? | – | ? | ? | – | ? | – | + | – | |||||
DOMAINS | ? | + | ? | ? | + | ? | + |
+ | + | |||||
DOMAIN_CONSTRAINTS | ? | + | ? | ? | + | ? | + |
+ | + | |||||
DOMAIN_USER_DEFINED_TYPE_USAGE | ? | – | ? | ? | – | ? | + domain_udt_usage |
+ |
– | |||||
element_types | ? | – | ? | ? | – | ? | + |
– | – | |||||
ENABLED_ROLES | ? | – | ? | ? | – | ? | + |
+ | – | |||||
foreign_data_wrapper_options | ? | – | ? | ? | – | ? | + |
– | – | |||||
foreign_data_wrappers | ? | – | ? | ? | – | ? | + |
– | – | |||||
foreign_server_options | ? | – | ? | ? | – | ? | + |
– | – | |||||
foreign_servers | ? | – | ? | ? | – | ? | + |
– | – | |||||
foreign_table_options | ? | – | ? | ? | – | ? | + |
– | – | |||||
foreign_tables | ? | – | ? | ? | – | ? | + |
– | – | |||||
KEY_COLUMN_USAGE | ? | + | ? | ? | + | ? | + | + | + | |||||
METHOD_SPECIFICATIONS | ? | – | ? | ? | – | ? | – | + | – | |||||
METHOD_SPECIFICATION_PARAMETERS | ? | – | ? | ? | – | ? | – | + |
– | |||||
MODULES | ? | – | ? | ? | – | ? | – | ? | + | |||||
PARAMETERS | ? | + | ? | ? | + | ? | + |
+ | + | |||||
REFERENTIAL_CONSTRAINTS | ? | + | ? | ? | + | ? | + |
+ | + | |||||
ROLE_COLUMN_GRANTS | ? | – | ? | ? | – | ? | + |
+ | – | |||||
ROLE_ROUTINE_GRANTS | ? | – | ? | ? | – | ? | + |
+ | – | |||||
ROLE_TABLE_GRANTS | ? | – | ? | ? | – | ? | + |
+ | – | |||||
ROLE_USAGE_GRANTS | ? | – | ? | ? | – | ? | + |
+ | – | |||||
ROLE_USER_DEFINED_TYPE_GRANTS | ? | – | ? | ? | – | ? | – | + |
– | |||||
ROUTINES | ? | + | ? | ? | + | ? | + |
+ | + | |||||
ROUTINE_COLUMNS | ? | + | ? | ? | + | ? | – | – | – | |||||
ROUTINE_COLUMN_USAGE | ? | – | ? | ? | – | ? | – | + | – | |||||
ROUTINE_PRIVILEGES | ? | – | ? | ? | – | ? | + |
+ | – | |||||
ROUTINE_TABLE_USAGE | ? | – | ? | ? | – | ? | – | + | – | |||||
SCHEMATA | ? | + | ? | ? | + | ? | + |
+ | + | |||||
sequences | ? | – | ? | ? | – | ? | + |
– | – | |||||
SQL_FEATURES | ? | – | ? | ? | – | ? | + |
+ | – | |||||
SQL_IMPLEMENTATION_INFO | ? | – | ? | ? | – | ? | + |
+ | – | |||||
SQL_PACKAGES | ? | – | ? | ? | – | ? | + |
+ | – | |||||
sql_parts | ? | – | ? | ? | – | ? | + |
– | – | |||||
SQL_SIZING | ? | – | ? | ? | – | ? | + |
+ | – | |||||
SQL_SIZING_PROFILES | ? | – | ? | ? | – | ? | + |
+ | – | |||||
SQL_LANGUAGES | ? | – | ? | ? | – | ? | + |
+ | + | |||||
TABLES | ? | + | ? | ? | + | ? | + |
+ | + | |||||
TABLE_CONSTRAINTS | ? | + | ? | ? | + | ? | + |
+ | + | |||||
TABLE_METHOD_PRIVILEGES | ? | – | ? | ? | – | ? | – | + | – | |||||
TABLE_PRIVILEGES | ? | + | ? | ? | + | ? | + |
+ | + | |||||
TRANSFORMS | ? | – | ? | ? | – | ? | – | + | – | |||||
TRANSLATIONS | ? | – | ? | ? | – | ? | – | + | + | |||||
TRIGGERED_UPDATE_COLUMNS | ? | – | ? | ? | – | ? | + |
+ |
– | |||||
TRIGGERS | ? | – | ? | ? | – | ? | + |
+ | – | |||||
TRIGGER_COLUMN_USAGE | ? | – | ? | ? | – | ? | – | + | – | |||||
TRIGGER_TABLE_USAGE | ? | – | ? | ? | – | ? | – | + | – | |||||
TYPE_INFO | ? | – | ? | ? | – | ? | – | + | – | |||||
USAGE_PRIVILEGES | ? | – | ? | ? | – | ? | + |
+ | + | |||||
USER_DEFINED_TYPE_PRIVILEGES | ? | – | ? | ? | – | ? | – | + |
– | |||||
USER_DEFINED_TYPES | ? | – | ? | ? | – | ? | – | + | – | |||||
user_mappings | ? | – | ? | ? | – | ? | + |
– | – | |||||
user_mapping_options | ? | – | ? | ? | – | ? | + |
– | – | |||||
VIEWS | ? | + | ? | ? | + | ? | + | + | + | |||||
VIEW_COLUMN_USAGE | ? | + | ? | ? | + | ? | + |
+ | + | |||||
view_routine_usage | ? | – | ? | ? | – | ? | + |
– | – | |||||
VIEW_TABLE_USAGE | ? | + | ? | ? | + | ? | + |
+ | + | |||||
INFORMATION_SCHEMA Views | Count |
And here is the SQL script I used to test each view:
select * from INFORMATION_SCHEMA.ADMINISTRABLE_ROLE_AUTHORIZATIONS select * from INFORMATION_SCHEMA.APPLICABLE_ROLES select * from INFORMATION_SCHEMA.ASSERTIONS select * from INFORMATION_SCHEMA.ATTRIBUTES select * from INFORMATION_SCHEMA.CHARACTER_SETS select * from INFORMATION_SCHEMA.CHECK_CONSTRAINTS select * from INFORMATION_SCHEMA.COLLATIONS select * from INFORMATION_SCHEMA.COLUMNS select * from INFORMATION_SCHEMA.COLUMN_DOMAIN_USAGE select * from INFORMATION_SCHEMA.COLUMN_PRIVILEGES select * from INFORMATION_SCHEMA.COLUMN_USER_DEFINED_TYPE_USAGE select * from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE select * from INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE select * from INFORMATION_SCHEMA.DIRECT_SUPERTABLES select * from INFORMATION_SCHEMA.DIRECT_SUPERTYPES select * from INFORMATION_SCHEMA.DOMAINS select * from INFORMATION_SCHEMA.DOMAIN_CONSTRAINTS select * from INFORMATION_SCHEMA.DOMAIN_USER_DEFINED_TYPE_USAGE select * from INFORMATION_SCHEMA.ENABLED_ROLES select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE select * from INFORMATION_SCHEMA.METHOD_SPECIFICATIONS select * from INFORMATION_SCHEMA.METHOD_SPECIFICATION_PARAMETERS select * from INFORMATION_SCHEMA.MODULES select * from INFORMATION_SCHEMA.PARAMETERS select * from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS select * from INFORMATION_SCHEMA.ROLE_COLUMN_GRANTS select * from INFORMATION_SCHEMA.ROLE_ROUTINE_GRANTS select * from INFORMATION_SCHEMA.ROLE_TABLE_GRANTS select * from INFORMATION_SCHEMA.ROLE_USAGE_GRANTS select * from INFORMATION_SCHEMA.ROLE_USER_DEFINED_TYPE_GRANTS select * from INFORMATION_SCHEMA.ROUTINES select * from INFORMATION_SCHEMA.ROUTINE_COLUMNS select * from INFORMATION_SCHEMA.ROUTINE_COLUMN_USAGE select * from INFORMATION_SCHEMA.ROUTINE_PRIVILEGES select * from INFORMATION_SCHEMA.ROUTINE_TABLE_USAGE select * from INFORMATION_SCHEMA.SCHEMATA select * from INFORMATION_SCHEMA.SQL_FEATURES select * from INFORMATION_SCHEMA.SQL_IMPLEMENTATION_INFO select * from INFORMATION_SCHEMA.SQL_PACKAGES select * from INFORMATION_SCHEMA.SQL_SIZING select * from INFORMATION_SCHEMA.SQL_SIZING_PROFILES select * from INFORMATION_SCHEMA.SQL_LANGUAGES select * from INFORMATION_SCHEMA.TABLES select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS select * from INFORMATION_SCHEMA.TABLE_METHOD_PRIVILEGES select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES select * from INFORMATION_SCHEMA.TRANSFORMS select * from INFORMATION_SCHEMA.TRANSLATIONS select * from INFORMATION_SCHEMA.TRIGGERED_UPDATE_COLUMNS select * from INFORMATION_SCHEMA.TRIGGERS select * from INFORMATION_SCHEMA.TRIGGER_COLUMN_USAGE select * from INFORMATION_SCHEMA.TRIGGER_TABLE_USAGE select * from INFORMATION_SCHEMA.TYPE_INFO select * from INFORMATION_SCHEMA.USAGE_PRIVILEGES select * from INFORMATION_SCHEMA.USER_DEFINED_TYPE_PRIVILEGES select * from INFORMATION_SCHEMA.USER_DEFINED_TYPES select * from INFORMATION_SCHEMA.VIEWS select * from INFORMATION_SCHEMA.VIEW_COLUMN_USAGE select * from INFORMATION_SCHEMA.VIEW_TABLE_USAGE
–jeroen
Filed under: Database Development, Development, Firebird, InterBase, ISO 8601, MySQL, OracleDB, PostgreSQL, Power User, SQL, SQL Server, SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2008 R2, SQL Server 2012, SQL Server 7, Sybase
