Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
| Nächste Überarbeitung | Vorherige Überarbeitung | ||
|
lpi1:sql [2010/07/28 15:26] 127.0.0.1 Externe Bearbeitung |
lpi1:sql [2015/08/17 13:07] (aktuell) ingo_wichmann [Dokumentation] |
||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| ====== Installation Pakete ====== | ====== Installation Pakete ====== | ||
| - | SuSE, Debian: | + | SuSE, Debian: ''sqlite3'' |
| - | sqlite3 | + | |
| - | CentOS: | + | CentOS: ''sqlite'' |
| - | sqlite | + | |
| ====== Unix Benutzer in SQLite Datenbank überführen ====== | ====== Unix Benutzer in SQLite Datenbank überführen ====== | ||
| Ein einfaches Beispiel als Schnell-Einstieg in SQL | Ein einfaches Beispiel als Schnell-Einstieg in SQL | ||
| - | ==== SQLite Datenbank anlegen ==== | + | ==== SQLite erstmals aufrufen ==== |
| sqlite3 accounts.db | sqlite3 accounts.db | ||
| .help | .help | ||
| Zeile 19: | Zeile 17: | ||
| Aufbau gemäß ''/etc/passwd'' : | Aufbau gemäß ''/etc/passwd'' : | ||
| - | sqlite3 accounts.db <<SQL | ||
| <code sql> | <code sql> | ||
| + | sqlite3 accounts.db <<SQL | ||
| + | |||
| CREATE TABLE users ( | CREATE TABLE users ( | ||
| uid text, | uid text, | ||
| Zeile 30: | Zeile 29: | ||
| shell text | shell text | ||
| ); | ); | ||
| + | |||
| + | SQL | ||
| </code> | </code> | ||
| - | SQL | ||
| ==== Benutzer importieren ==== | ==== Benutzer importieren ==== | ||
| Zeile 44: | Zeile 44: | ||
| SQL INSERT Statement zum Einfügen der Daten in die Tabelle ''users'': | SQL INSERT Statement zum Einfügen der Daten in die Tabelle ''users'': | ||
| - | cat <<SQL | ||
| <code sql> | <code sql> | ||
| + | cat <<SQL | ||
| + | |||
| INSERT INTO users ( uid, password, uidNumber, gidNumber, gecos, home, shell ) | INSERT INTO users ( uid, password, uidNumber, gidNumber, gecos, home, shell ) | ||
| VALUES ( '$uid', '$password', '$uidNumber', '$gidNumber', '$gecos', '$home', '$shell' ); | VALUES ( '$uid', '$password', '$uidNumber', '$gidNumber', '$gecos', '$home', '$shell' ); | ||
| + | |||
| + | SQL | ||
| </code> | </code> | ||
| - | SQL | ||
| === Mit ''while''-Schleife alle Benutzer importieren === | === Mit ''while''-Schleife alle Benutzer importieren === | ||
| Zeile 66: | Zeile 68: | ||
| Für die ''/etc/group'' werden zwei Tabellen benötigt: | Für die ''/etc/group'' werden zwei Tabellen benötigt: | ||
| - | sqlite3 accounts.db <<SQL | ||
| <code sql> | <code sql> | ||
| - | CREATE TABLE groups ( gid text, password text, gidNumber integer ); | + | sqlite3 accounts.db <<SQL |
| - | CREATE TABLE members ( gidNumber integer, uid text ); | + | |
| - | </code> | + | |
| - | SQL | + | |
| + | CREATE TABLE groups ( gid text, password text, gidNumber integer ); | ||
| + | CREATE TABLE members ( gidNumber integer, uid text ); | ||
| + | SQL | ||
| + | </code> | ||
| ==== Gruppen importieren ==== | ==== Gruppen importieren ==== | ||
| Zeile 118: | Zeile 119: | ||
| ... können die Mitglieder dann einer nach dem anderen in die Variable ''$member'' eingelesen und zusammen mit der ''$gidNumber'' in die Tabelle ''members'' geschrieben werden. | ... können die Mitglieder dann einer nach dem anderen in die Variable ''$member'' eingelesen und zusammen mit der ''$gidNumber'' in die Tabelle ''members'' geschrieben werden. | ||
| + | ==== Das Skript in einer Datei ==== | ||
| + | <file bash unix_users2sql.sh> | ||
| + | #!/bin/bash | ||
| + | |||
| + | # Tabelle für Benutzer anlegen | ||
| + | sqlite3 accounts.db <<SQL | ||
| + | CREATE TABLE users ( | ||
| + | uid text, | ||
| + | password text, | ||
| + | uidNumber integer, | ||
| + | gidNumber integer, | ||
| + | gecos text, | ||
| + | home text, | ||
| + | shell text | ||
| + | ); | ||
| + | SQL | ||
| + | |||
| + | # Benutzer importieren | ||
| + | while IFS=':' read uid password uidNumber gidNumber gecos home shell; | ||
| + | do | ||
| + | cat <<SQL | ||
| + | INSERT INTO users ( uid, password, uidNumber, gidNumber, gecos, home, shell ) | ||
| + | VALUES ( '$uid', '$password', '$uidNumber', '$gidNumber', '$gecos', '$home', '$shell' ); | ||
| + | SQL | ||
| + | done < /etc/passwd | sqlite3 accounts.db | ||
| + | |||
| + | ## Tabellen für Gruppen anlegen | ||
| + | sqlite3 accounts.db <<SQL | ||
| + | CREATE TABLE groups ( gid text, password text, gidNumber integer ); | ||
| + | CREATE TABLE members ( gidNumber integer, uid text ); | ||
| + | SQL | ||
| + | |||
| + | ## Gruppen importieren | ||
| + | while IFS=':' read gid password gidNumber members; | ||
| + | do | ||
| + | cat <<SQL | ||
| + | INSERT INTO groups ( gid, password, gidNumber ) | ||
| + | VALUES ( '$gid', '$password', '$gidNumber' ); | ||
| + | SQL | ||
| + | done < /etc/group | sqlite3 accounts.db | ||
| + | |||
| + | ## Gruppenmitglieder importieren | ||
| + | while IFS=':' read gid password gidNumber members; | ||
| + | do | ||
| + | for uid in $(echo $members | tr ',' ' '); | ||
| + | do | ||
| + | echo "INSERT INTO members ( gidNumber, uid ) VALUES ( '$gidNumber', '$uid' );" | ||
| + | done | ||
| + | done < /etc/group | sqlite3 accounts.db | ||
| + | </file> | ||
| ==== Der fertige SQL-Dump ==== | ==== Der fertige SQL-Dump ==== | ||
| Zeile 182: | Zeile 233: | ||
| ===== einfache SELECT Abfragen ===== | ===== einfache SELECT Abfragen ===== | ||
| - | ==== Alle Benutzer wie in ''/etc/passwd'' ausgeben ==== | + | ==== Alle Benutzer in ''/etc/passwd'' ausgeben ==== |
| <code sql>select * from users;</code> | <code sql>select * from users;</code> | ||
| + | analog zu | ||
| + | cat /etc/passwd | ||
| ==== Benutzer root ausgeben ==== | ==== Benutzer root ausgeben ==== | ||
| <code sql>select * from users where uid = 'root';</code> | <code sql>select * from users where uid = 'root';</code> | ||
| + | analog zu | ||
| + | grep '^root' /etc/passwd | ||
| ==== Shell des Benutzers root ausgeben ==== | ==== Shell des Benutzers root ausgeben ==== | ||
| <code sql>select shell from users where uid = 'root';</code> | <code sql>select shell from users where uid = 'root';</code> | ||
| + | analog zu | ||
| + | grep '^root' /etc/passwd | cut -d: -f 7 | ||
| ==== Benutzer nach Name sortiert ausgeben ==== | ==== Benutzer nach Name sortiert ausgeben ==== | ||
| - | <code sql>select * from users order by uid;</code> | + | <code sql>select * from users order by uidNumber;</code> |
| + | analog zu | ||
| + | sort -n -t: -k3 /etc/passwd | ||
| ==== Anzahl der Benutzer ausgeben ==== | ==== Anzahl der Benutzer ausgeben ==== | ||
| <code sql>select count(*) from users;</code> | <code sql>select count(*) from users;</code> | ||
| + | analog zu | ||
| + | wc -l /etc/passwd | ||
| ==== Wie viele Benutzer verwenden welche Shell ? ==== | ==== Wie viele Benutzer verwenden welche Shell ? ==== | ||
| <code sql>select shell, count(shell) from users group by shell;</code> | <code sql>select shell, count(shell) from users group by shell;</code> | ||
| + | analog zu | ||
| + | cut -d : -f 7 /etc/passwd|sort|uniq -c | ||
| ===== JOIN ===== | ===== JOIN ===== | ||
| Alle Benutzer, ihre Passwörter und ihre primäre Gruppe namentlich ausgeben | Alle Benutzer, ihre Passwörter und ihre primäre Gruppe namentlich ausgeben | ||
| Zeile 226: | Zeile 286: | ||
| on users.gidNumber = groups.gidNumber; | on users.gidNumber = groups.gidNumber; | ||
| </code> | </code> | ||
| - | |||
| ==== JOIN USING ==== | ==== JOIN USING ==== | ||
| Zeile 244: | Zeile 303: | ||
| natural join groups; | natural join groups; | ||
| </code> | </code> | ||
| - | |||
| - | |||
| ===== Subselect ===== | ===== Subselect ===== | ||
| - | Die Durchschnitt der Gruppennummern aus der Tabelle ''users'' berechnen: | + | Den Durchschnitt der Gruppennummern aus der Tabelle ''users'' berechnen: |
| <code sql> | <code sql> | ||
| select avg(gidNumber) from users; | select avg(gidNumber) from users; | ||
| </code> | </code> | ||
| - | Alle Gruppen, deren Nummer größer als dieser Durchschnitt ist: | + | Alle Gruppen, deren Nummer größer als der Durchschnitt ist: |
| <code sql> | <code sql> | ||
| select gid from groups where gidNumber > ( select avg(gidNumber) from users ); | select gid from groups where gidNumber > ( select avg(gidNumber) from users ); | ||
| </code> | </code> | ||
| - | |||
| - | |||
| - | |||
| - | |||
| Join mit Hilfe von Subselect: | Join mit Hilfe von Subselect: | ||
| Zeile 273: | Zeile 326: | ||
| ); | ); | ||
| </code> | </code> | ||
| - | |||
| Bei allen Benutzern mit Benutzernummern zwischen 500 und 10000 die Benutzernummer um 500 erhöhen: | Bei allen Benutzern mit Benutzernummern zwischen 500 und 10000 die Benutzernummer um 500 erhöhen: | ||
| Zeile 282: | Zeile 334: | ||
| </code> | </code> | ||
| + | ====== Datenbank verändern ====== | ||
| + | ===== Datensätze verändern ===== | ||
| + | ==== Zeile hinzufügen ==== | ||
| + | Gruppe mit neuer uidNumber hinzufügen | ||
| + | INSERT INTO groups (gid, password, gidNumber) VALUES ( 'projekt-y', 'x', ( SELECT MAX(gidNumber) FROM groups WHERE gidNumber < 65000)+1); | ||
| + | ==== Zeile kopieren ==== | ||
| + | INSERT INTO groups SELECT * FROM groups WHERE gid = 'projekt-y'; | ||
| + | ==== Zeile verändern ==== | ||
| + | UPDATE groups SET gid = 'projekt-z' WHERE gid = 'projekt-y'; | ||
| + | ==== Zeile löschen ==== | ||
| + | DELETE FROM groups WHERE gid = 'projekt-y'; | ||
| + | ==== Spalte hinzufügen ==== | ||
| + | | ||
| + | | ||
| ====== Übung ====== | ====== Übung ====== | ||
| Schreiben sie Skripte mit SQL Anweisungen, die als Ersatz für die Linuxbefehle | Schreiben sie Skripte mit SQL Anweisungen, die als Ersatz für die Linuxbefehle | ||
| Zeile 297: | Zeile 363: | ||
| ====== Dokumentation ====== | ====== Dokumentation ====== | ||
| * [[http://www.sqlite.org/lang.html]] | * [[http://www.sqlite.org/lang.html]] | ||
| + | * {{:visual_sql_joins_orig.jpg?200|}} ( [[http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins| Quelle]] ) | ||