-- 1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡΡ users Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠ΅ΠΉ
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
-- ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ email (ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅)
CONSTRAINT valid_email CHECK (
email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'
),
-- ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ Π΄Π»ΠΈΠ½Ρ ΠΈΠΌΠ΅Π½ΠΈ (ΠΌΠΈΠ½ΠΈΠΌΡΠΌ 3 ΡΠΈΠΌΠ²ΠΎΠ»Π°)
CONSTRAINT valid_username CHECK (
LENGTH(username) >= 3
),
-- ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ ΠΏΠ°ΡΠΎΠ»Ρ (ΠΌΠΈΠ½ΠΈΠΌΡΠΌ 8 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²)
CONSTRAINT valid_password CHECK (
LENGTH(password_hash) >= 8
)
);
-- 2. Π’ΡΠΈΠ³Π³Π΅Ρ Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ updated_at
CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER update_users_updated_at
BEFORE UPDATE ON users
FOR EACH ROW
EXECUTE FUNCTION update_modified_column();
-- 3. ΠΡΠΈΠΌΠ΅ΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ
-- Π£ΡΠΏΠ΅ΡΠ½ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ:
INSERT INTO users (username, email, password_hash)
VALUES ('alex_ivanov', 'alex@example.com', 'secure12345');
INSERT INTO users (username, email, password_hash, is_active)
VALUES ('maria_petrova', 'maria@test.org', 'qwerty123', FALSE);
-- ΠΡΠΈΠ±ΠΎΡΠ½ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ (ΡΠ°ΡΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΡΠΉΡΠ΅ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ):
-- β ΠΠ°ΡΡΡΠ΅Π½ΠΈΠ΅ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΡΡΠΈ email
-- INSERT INTO users (username, email, password_hash)
-- VALUES ('alex2', 'alex@example.com', '12345678');
-- β ΠΠ΅Π²Π΅ΡΠ½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ email
-- INSERT INTO users (username, email, password_hash)
-- VALUES ('test', 'invalid-email', 'password123');
-- β Π‘Π»ΠΈΡΠΊΠΎΠΌ ΠΊΠΎΡΠΎΡΠΊΠΈΠΉ username
-- INSERT INTO users (username, email, password_hash)
-- VALUES ('ab', 'ab@test.com', 'password123');
-- 4. ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π΄Π°Π½Π½ΡΡ
SELECT * FROM users;