init.sql 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. -- Таблицы базы данных Ресторан
  2. CREATE TABLE IF NOT EXISTS "Персонал" (
  3. id_персонала SERIAL PRIMARY KEY,
  4. фио VARCHAR(100) NOT NULL,
  5. год_рождения INT,
  6. должность VARCHAR(50),
  7. оклад NUMERIC(10,2) CHECK (оклад >= 0),
  8. телефон VARCHAR(20),
  9. адрес VARCHAR(200),
  10. паспортные_данные VARCHAR(50)
  11. );
  12. CREATE TABLE IF NOT EXISTS "Блюда" (
  13. id_блюда SERIAL PRIMARY KEY,
  14. блюдо VARCHAR(100) NOT NULL,
  15. категория VARCHAR(50),
  16. вес_г INT
  17. );
  18. CREATE TABLE IF NOT EXISTS "Склад" (
  19. id_ингредиента SERIAL PRIMARY KEY,
  20. ингредиент VARCHAR(100) NOT NULL,
  21. вес_кг NUMERIC(8,3) CHECK (вес_кг >= 0),
  22. цена_руб NUMERIC(10,2) CHECK (цена_руб >= 0)
  23. );
  24. CREATE TABLE IF NOT EXISTS "Заказы" (
  25. id_заказа SERIAL PRIMARY KEY,
  26. код_заказа VARCHAR(20) UNIQUE NOT NULL,
  27. дата_заказа DATE NOT NULL,
  28. id_персонала INT REFERENCES "Персонал"(id_персонала)
  29. );
  30. CREATE TABLE IF NOT EXISTS audit_log (
  31. id SERIAL PRIMARY KEY,
  32. таблица VARCHAR(50),
  33. операция VARCHAR(10),
  34. старые_данные TEXT,
  35. новые_данные TEXT,
  36. пользователь VARCHAR(50) DEFAULT current_user,
  37. время TIMESTAMP DEFAULT now()
  38. );
  39. -- Триггер логирования Персонал
  40. CREATE OR REPLACE FUNCTION log_персонал() RETURNS trigger AS $$
  41. BEGIN
  42. IF TG_OP = 'DELETE' THEN
  43. INSERT INTO audit_log(таблица,операция,старые_данные)
  44. VALUES ('Персонал','DELETE',ROW(OLD.*)::text);
  45. RETURN OLD;
  46. ELSIF TG_OP = 'UPDATE' THEN
  47. INSERT INTO audit_log(таблица,операция,старые_данные,новые_данные)
  48. VALUES ('Персонал','UPDATE',ROW(OLD.*)::text,ROW(NEW.*)::text);
  49. RETURN NEW;
  50. ELSIF TG_OP = 'INSERT' THEN
  51. INSERT INTO audit_log(таблица,операция,новые_данные)
  52. VALUES ('Персонал','INSERT',ROW(NEW.*)::text);
  53. RETURN NEW;
  54. END IF;
  55. END; $$ LANGUAGE plpgsql;
  56. DROP TRIGGER IF EXISTS trg_audit_персонал ON "Персонал";
  57. CREATE TRIGGER trg_audit_персонал
  58. AFTER INSERT OR UPDATE OR DELETE ON "Персонал"
  59. FOR EACH ROW EXECUTE FUNCTION log_персонал();
  60. -- Триггер логирования Заказы
  61. CREATE OR REPLACE FUNCTION log_заказы() RETURNS trigger AS $$
  62. BEGIN
  63. IF TG_OP = 'DELETE' THEN
  64. INSERT INTO audit_log(таблица,операция,старые_данные)
  65. VALUES ('Заказы','DELETE',ROW(OLD.*)::text);
  66. RETURN OLD;
  67. ELSIF TG_OP = 'UPDATE' THEN
  68. INSERT INTO audit_log(таблица,операция,старые_данные,новые_данные)
  69. VALUES ('Заказы','UPDATE',ROW(OLD.*)::text,ROW(NEW.*)::text);
  70. RETURN NEW;
  71. ELSIF TG_OP = 'INSERT' THEN
  72. INSERT INTO audit_log(таблица,операция,новые_данные)
  73. VALUES ('Заказы','INSERT',ROW(NEW.*)::text);
  74. RETURN NEW;
  75. END IF;
  76. END; $$ LANGUAGE plpgsql;
  77. DROP TRIGGER IF EXISTS trg_audit_заказы ON "Заказы";
  78. CREATE TRIGGER trg_audit_заказы
  79. AFTER INSERT OR UPDATE OR DELETE ON "Заказы"
  80. FOR EACH ROW EXECUTE FUNCTION log_заказы();
  81. -- Роли
  82. DO $$ BEGIN
  83. IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = 'db_admin') THEN
  84. CREATE ROLE db_admin LOGIN PASSWORD 'Admin@123';
  85. END IF;
  86. END $$;
  87. GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO db_admin;
  88. GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO db_admin;
  89. DO $$ BEGIN
  90. IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = 'db_manager') THEN
  91. CREATE ROLE db_manager LOGIN PASSWORD 'Manager@123';
  92. END IF;
  93. END $$;
  94. GRANT SELECT, INSERT, UPDATE ON "Персонал","Заказы","Блюда","Склад" TO db_manager;
  95. GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO db_manager;
  96. DO $$ BEGIN
  97. IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = 'db_waiter') THEN
  98. CREATE ROLE db_waiter LOGIN PASSWORD 'Waiter@123';
  99. END IF;
  100. END $$;
  101. GRANT SELECT ON "Блюда","Склад","Персонал" TO db_waiter;
  102. GRANT SELECT, INSERT ON "Заказы" TO db_waiter;
  103. DO $$ BEGIN
  104. IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = 'db_readonly') THEN
  105. CREATE ROLE db_readonly LOGIN PASSWORD 'Readonly@123';
  106. END IF;
  107. END $$;
  108. GRANT SELECT ON ALL TABLES IN SCHEMA public TO db_readonly;