PostgreSQL DDL Operations: Difference between revisions
Line 108: | Line 108: | ||
This command will not work if there are users connected to the database: | This command will not work if there are users connected to the database: | ||
<font size=-2> | |||
ERROR: database "..." is being accessed by other users | ERROR: database "..." is being accessed by other users | ||
DETAIL: There are 10 other sessions using the database. | DETAIL: There are 10 other sessions using the database. | ||
</font> | |||
The database can though be forcefully dropped as follows ('''enclose the database name in single quotes'''): | The database can though be forcefully dropped as follows ('''enclose the database name in single quotes'''): | ||
<syntaxhighlight lang='sql'> | |||
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '<''db-name''>'; | |||
</syntaxhighlight> | |||
This will report a number of backends and it will take a while until all will be terminated. You may need to run it several times to insure that all backends are gone. | This will report a number of backends and it will take a while until all will be terminated. You may need to run it several times to insure that all backends are gone. | ||
Line 119: | Line 123: | ||
If there is a lot of activity on the database, you may optionally disallow new connections: | If there is a lot of activity on the database, you may optionally disallow new connections: | ||
<syntaxhighlight lang='sql'> | |||
UPDATE pg_database SET datallowconn = 'false' WHERE datname = '<''db-name''>'; | |||
ALTER DATABASE <''db-name''> CONNECTION LIMIT 1; | |||
</syntaxhighlight> | |||
When all backends are gone, the database can be dropped. | When all backends are gone, the database can be dropped. |
Revision as of 04:03, 14 October 2023
Internal
psql Command Line
Specify the Database to Interact with
psql -d|--dbname= <database-name> ...
Providing a Password to psql in Command Line
If a database is protected by a password, psql will challenge for password interactively. That can be avoided in scripts as follows:
export PGPASSWORD=password; psql -l -h some.host -U some-user ...
In-Line SQL Commands
psql ... -c "''sql-command''"
Example:
psql -h something.ak29cdi3ewgm.ca-central-1.rds.amazonaws.com -U infinity -d test_10 -c "GRANT ALL PRIVILEGES ON DATABASE test_10 TO infinity;"
File-Stored SQL Commands
psql -f|--file= <file-name> ...
Version
Server version:
pg_config --version
Client version:
psql --version
Also, execute:
SELECT version():
Cluster
initdb
initdb
will create a new database cluster.
initdb --locale=C -E UTF-8 /opt/brew/var/postgresql@14
Database
See
List Databases
psql -l [-h ... -U ... -d ...]
or
> \l
or
SELECT datname FROM pg_database;
Create a Database
Via a command:
createdb <dbname>
createdb playground
Via SQL over an established psql
session:
CREATE DATABASE <dbname>;
Also see:
Connect to a Database
Drop a Database
Via a command:
dropdb <dbname>
Via SQL over an established psql
session:
DROP DATABASE <''dbname''>;
This command will not work if there are users connected to the database:
ERROR: database "..." is being accessed by other users DETAIL: There are 10 other sessions using the database.
The database can though be forcefully dropped as follows (enclose the database name in single quotes):
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '<''db-name''>';
This will report a number of backends and it will take a while until all will be terminated. You may need to run it several times to insure that all backends are gone.
If there is a lot of activity on the database, you may optionally disallow new connections:
UPDATE pg_database SET datallowconn = 'false' WHERE datname = '<''db-name''>';
ALTER DATABASE <''db-name''> CONNECTION LIMIT 1;
When all backends are gone, the database can be dropped.
Users
The following user operations are supported.
List Users
psql \du
or
SELECT usename FROM pg_user;
Create User
Command line:
createuser <user_name>
or SQL client:
CREATE USER <user_name>;
Change Password
In psql, for the current user:
\password <user_name>
or
ALTER USER user_name WITH PASSWORD 'new_password';
Granting Privileges on a Database
GRANT ALL PRIVILEGES ON DATABASE <dbname> TO <user>;
Alternative from command line:
psql -h something.ak29cdi3ewgm.ca-central-1.rds.amazonaws.com -U infinity -d test_10 -c "GRANT ALL PRIVILEGES ON DATABASE test_10 TO infinity;"
Delete a User
DROP USER <username>
Tablespace
List Tablespaces
psql \db
Tables
List Tables
psql \dt
SELECT * FROM pg_catalog.pg_tables;
Describe Table Structure
\d <table_name>
Create a Table
CREATE TABLE poc_library_component
(
"id" int NOT NULL,
"name" text,
"desc" text,
"color" varchar(10),
CONSTRAINT poc_library_component_pk PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
ALTER TABLE poc_library_component OWNER TO is3_as;
The table name is case insensitive, it can be specified using upper case or lower case, it will be reported in lowercase.
The type names are case insensitive.
The column names are case sensitive.
For documentation on types, see:
Create a Table Only If Does Not Exist
CREATE TABLE IF NOT EXISTS <table_name> ...
Records
Delete Records
DELETE FROM <table-name>;