Мені слід створити таку програму WINFORMS де буде підключена база даних SQL Server Management Studio з трьома користувачами , Директор ( має доступ до Всіх команд і всієї бази), Адмін має доступ до Всіх баз , але має право тільки редагувати, продивлятися, і додавати дані в базу(видалення заборонено)І користувач гість, який має право лише на перегляд даних. Зроби так, щоб при вході в програму питався логін і пароль, наприклад якщо директор то буде логін Owner і пароль Owner, якщо вхід для адміна то логін Admin , пароль Admin , якщо гість то будь-який логін і пароль для введення. І сама програма буде запитувати , що зробити?Завдання з SQL MANAGMENT STUDIO для програми та меню create database solarsystem2use solarsystem2 create table Sun(Sun_id int PRIMARY KEY, Name VARCHAR(255),Mass BIGINT, Radius BIGINT,Color VARCHAR(50) )create table Satellites( Satallite_id int PRIMARY KEY,Name VARCHAR(255), Mass BIGINT,Radius BIGINT, Color VARCHAR(50)) create table Planets(Planet_id int PRIMARY KEY, Name VARCHAR(255),Mass BIGINT, Radius BIGINT,Distance_sun BIGINT, Type_planet VARCHAR(50),Color VARCHAR(50), Sun_id int REFERENCES Sun(Sun_id) ON DELETE NO ACTION ON UPDATE CASCADE,Satallite_id int REFERENCES Satellites(Satallite_id) ON DELETE NO ACTION ON UPDATE CASCADE )create table Sunnyspace( Sunnyspace_id int PRIMARY KEY,Name VARCHAR(255), Mass BIGINT,Radius BIGINT, Color VARCHAR(50),Sun_id int REFERENCES Sun(Sun_id) ON DELETE NO ACTION ON UPDATE CASCADE )create table Comets( Comets_id int PRIMARY KEY,Name VARCHAR(255), Mass BIGINT,Radius BIGINT, Color VARCHAR(50),Sunnyspace_id int REFERENCES Sunnyspace(Sunnyspace_id) ON DELETE NO ACTION ON UPDATE CASCADE )create table Meteorites( Meteorites_id int PRIMARY KEY,Name VARCHAR(255), Mass BIGINT,Radius BIGINT, Color VARCHAR(50),Sunnyspace_id int REFERENCES Sunnyspace(Sunnyspace_id) ON DELETE NO ACTION ON UPDATE CASCADE )INSERT INTO Sun (Sun_id, Name, Mass, Radius, Color) VALUES (1, 'Сонце', 19890, 696340, 'жовто-оранжевий');SELECT * FROM Sun; INSERT INTO Satellites (Satallite_id, Name, Mass, Radius, Color) VALUES (2, 'Місяць', 734770, 173710, 'білий'),(3, 'Титан', 134520, 5152, 'жовто-оранжевий'), (4, 'Європа', 48000, 3138, 'коричнево-білий'),(5, 'Каллісто', 10800, 4821, 'жовтувато-червоний'), (6, 'Тритон', 21400, 13534, 'коричневий');SELECT * FROM Satellites; INSERT INTO Planets (Planet_id, Name, Mass, Radius, Distance_Sun, Type_planet, Color, Sun_id, Satallite_id) VALUES (7,'Меркурій', 330100, 24397, 69820, 'земний тип', 'коричневий', '1', '2'),(8,'Венера', 486850, 60518, 108000, 'земний тип', 'жовтий', '1', '2'), (9,'Земля', 597370, 63710, 14960, 'земний тип', 'синій', '1', '2'),(10,'Марс', 641710, 33895, 250000, 'земний тип', 'червоний', '1', '2'), (11,'Юпітер', 189860, 690911, 77857, 'газовий тип', 'коричнево-жовтий', '1', '2'),(12,'Сатурн', 568460, 60268, 143000, 'газовий тип', 'золотий', '1', '2'), (13,'Уран', 868100, 25559, 287100, 'крижаний тип', 'сріблясто-білий', '1', '2'),(14,'Нептун', 102430, 24764, 450000, 'крижаний тип', 'блакитний', '1', '2'); SELECT * FROM Planets; INSERT INTO SunnySpace (SunnySpace_id, Name, Mass, Radius, Color, Sun_id) VALUES (15,'Сонячна система', 1001400, NULL, NULL, '1'); SELECT * FROM SunnySpace; INSERT INTO Comets (Comets_id, Name, Mass, Radius, Color, Sunnyspace_id) VALUES(16, 'Барнарда 1', NULL, NULL, NULL, '15'), (17, 'Бешора', NULL, NULL, NULL,'15'),(18, 'Боаттіні 1', NULL, NULL, NULL,'15'), (19, 'Боаттіні 2', NULL, NULL, NULL,'15'),(20, 'Галлея', 22000 , 120, 'фіолетовий','15'); SELECT * FROM Comets; INSERT INTO Meteorites (Meteorites_id, Name, Mass, Radius, Color, Sunnyspace_id) VALUES(21, 'Гоба', 60000, 27, 'коричневий','15'), (22, 'Альєнде', 3000, NULL, 'сірий','15'),(23, 'Мурчисонський', 1080, NULL, 'чорний','15'), (24, 'Сіхоте-Алінь', 1000, NULL, 'коричневий','15'),(25, 'ALH84001', 1930, NULL, 'сірий','15'); SELECT * FROM Meteorites; Select * from SatellitesWhere Satellites.Color = 'коричневий'; Select * from Planets Where Name Like 'С%'; Select * from SatellitesWhere Satellites.Color Between 'білий' And'жовто-оранжевий' Select * from Meteorites Where Meteorites_id in (21,23) Select * from CometsWhere Comets.Mass > '1000' And Comets.Name = 'Галлея' SELECT Planets.*, Satellites.Name AS SatelliteName, Satellites.Color AS SatelliteColor FROM PlanetsINNER JOIN Satellites ON Planets.Satallite_id = Satellites.Satallite_id; SELECT Planets.Color, Satellites.Color FROM Planets, SatellitesWHERE Planets.Color=Satellites.Color; SELECT Meteorites.Name FROM MeteoritesWHERE (Meteorites.Mass>(SELECT AVG (Mass) FROM Meteorites)); SELECT FROM Satellites WHERE Satallite_id IN (SELECT Satallite_id FROM SatellitesWHERE Mass >=20000); INSERT INTO Planets( Planet_id, Name, Mass, Radius, Distance_Sun, Type_planet, Color, Sun_id, Satallite_id ) VALUES (26,'Плутон', 13030, 11870, 591000, 'карликовий тип', 'коричневий', '1', '2'); INSERT INTO Planets (Name)SELECT Name FROM PlanetsWHERE Name LIKE 'M%'; UPDATE Planets SET Radius = (9.13Radius) WHERE Planet_id=9; DELETE MeteoritesFROM Meteorites WHERE Meteorites_id=25; DELETE PlanetsFROM Planets WHERE Color=(SELECT Color FROM PlanetsWHERE Planet_id = 26); SELECT Name, Color, Mass FROM PlanetsUNION SELECT Name, Color, MassFROM Satellites; DECLARE @min DECIMAL(10, 4) = 0.5; DECLARE @radius_min BIGINT = 1000;SELECT p.Planet_id, p.Name AS PlanetName, p.Mass AS PlanetMass, p.Radius AS PlanetRadius, p.Distance_sun AS DistanceFromSun, p.Type_planet AS PlanetType, p.Color AS PlanetColor, s.Satallite_id AS SatelliteID, s.Name AS SatelliteName, s.Mass AS SatelliteMass, s.Radius AS SatelliteRadius, s.Color AS SatelliteColor FROM Planets p INNER JOIN Satellites s ON p.Satallite_id = s.Satallite_id WHERE p.Mass > @min AND s.Radius >= @radius_min; CREATE VIEW Sunnyspace_Comets_View ASSELECT s.Sunnyspace_id, s.Name AS Sunnyspace_Name, s.Mass AS Sunnyspace_Mass, s.Radius AS Sunnyspace_Radius, s.Color AS Sunnyspace_Color, c.Comets_id, c.Name AS Comet_Name, c.Mass AS Comet_Mass, c.Radius AS Comet_Radius, c.Color AS Comet_Color FROM Sunnyspace sLEFT JOIN Comets c ON s.Sunnyspace_id = c.Sunnyspace_id; SELECT * FROM Sunnyspace_Comets_View; CREATE VIEW Sunnyspace_Meteorites_View AS SELECT s.Sunnyspace_id, s.Name AS Sunnyspace_Name, s.Mass AS Sunnyspace_Mass, s.Radius AS Sunnyspace_Radius, s.Color AS Sunnyspace_Color, m.Meteorites_id, m.Name AS Meteorite_Name, m.Mass AS Meteorite_Mass, m.Radius AS Meteorite_Radius, m.Color AS Meteorite_Color FROM Sunnyspace sLEFT JOIN Meteorites m ON s.Sunnyspace_id = m.Sunnyspace_id; SELECT * FROM Sunnyspace_Meteorites_View; CREATE VIEW Sun_Planets_View AS SELECT s.Sun_id, s.Name AS Sun_Name, s.Mass AS Sun_Mass, s.Radius AS Sun_Radius, s.Color AS Sun_Color, p.Planet_id, p.Name AS Planet_Name, p.Mass AS Planet_Mass, p.Radius AS Planet_Radius, p.Distance_sun AS Planet_Distance_Sun, p.Type_planet AS Planet_Type, p.Color AS Planet_Color FROM Sun sLEFT JOIN Planets p ON s.Sun_id = p.Sun_id; SELECT * FROM Sun_Planets_View; CREATE VIEW Sun_Satellites_View AS SELECT s.Sun_id, s.Name AS Sun_Name, s.Mass AS Sun_Mass, s.Radius AS Sun_Radius, s.Color AS Sun_Color, sat.Satallite_id, sat.Name AS Satellite_Name, sat.Mass AS Satellite_Mass, sat.Radius AS Satellite_Radius, sat.Color AS Satellite_ColorFROM Sun s LEFT JOIN Satellites sat ON s.Sun_id = sat.Satallite_id;SELECT * FROM Sun_Satellites_View;
CREATE VIEW Sunnyspace_Objects_View ASSELECT s.Sunnyspace_id, s.Name AS Sunnyspace_Name, s.Mass AS Sunnyspace_Mass, s.Radius AS Sunnyspace_Radius, s.Color AS Sunnyspace_Color, c.Comets_id, c.Name AS Comet_Name, c.Mass AS Comet_Mass, c.Radius AS Comet_Radius, c.Color AS Comet_Color, m.Meteorites_id, m.Name AS Meteorite_Name, m.Mass AS Meteorite_Mass, m.Radius AS Meteorite_Radius, m.Color AS Meteorite_ColorFROM Sunnyspace s LEFT JOIN Comets c ON s.Sunnyspace_id = c.Sunnyspace_idLEFT JOIN Meteorites m ON s.Sunnyspace_id = m.Sunnyspace_id; SELECT * FROM Sunnyspace_Objects_View; CREATE PROCEDURE GetCelestialBodiesAboveEarth ASBEGIN SELECT Sun.Name, Sun.Mass FROM Sun WHERE Sun.Mass > (SELECT Mass FROM Planets WHERE Name = 'Земля'); SELECT Satellites.Name, Satellites.Mass FROM Satellites WHERE Satellites.Mass > (SELECT Mass FROM Planets WHERE Name = 'Земля'); SELECT Planets.Name, Planets.Mass FROM Planets WHERE Planets.Mass > (SELECT Mass FROM Planets WHERE Name = 'Земля'); SELECT Sunnyspace.Name, Sunnyspace.Mass FROM Sunnyspace WHERE Sunnyspace.Mass > (SELECT Mass FROM Planets WHERE Name = 'Земля'); SELECT Comets.Name, Comets.Mass FROM Comets WHERE Comets.Mass > (SELECT Mass FROM Planets WHERE Name = 'Земля'); SELECT Meteorites.Name, Meteorites.Mass FROM Meteorites WHERE Meteorites.Mass > (SELECT Mass FROM Planets WHERE Name = 'Земля'); END;Execute GetCelestialBodiesAboveEarth CREATE PROCEDURE ReduceSaturnRadius AS BEGIN UPDATE Planets SET Radius = Radius * 0.9 WHERE Planets.Name = 'Сатурн'; END;Execute ReduceSaturnRadius CREATE PROCEDURE GetBrownColoredBodies AS BEGIN SELECT Name, Color FROM Sun WHERE Color = 'коричневий'; SELECT Name, Color FROM Satellites WHERE Color = 'коричневий'; SELECT Name, Color FROM Planets WHERE Color = 'коричневий'; SELECT Name, Color FROM Sunnyspace WHERE Color = 'коричневий'; SELECT Name, Color FROM Comets WHERE Color = 'коричневий'; SELECT Name, Color FROM Meteorites WHERE Color = 'коричневий';END; Execute GetBrownColoredBodies CREATE PROCEDURE CountBrownMeteorites ASBEGIN SELECT COUNT() AS BrownMeteoriteCount FROM Meteorites WHERE Color = 'коричневий';END; Execute CountBrownMeteorites CREATE PROCEDURE CountWhiteSatellites AS BEGIN SELECT COUNT() AS WhiteSatelliteCount FROM Satellites INNER JOIN Planets ON Satellites.Satallite_id = Planets.Satallite_id WHERE Satellites.Color = 'білий'; END;Execute CountWhiteSatellites CREATE PROCEDURE overlay @name VARCHAR(255), @mass BIGINT, @radius BIGINT, @color VARCHAR(50), @Sun_id INTAS BEGIN DECLARE @countSubject INT; SET NOCOUNT ON; SELECT @countSubject = COUNT(*) FROM Planets; INSERT INTO Planets (Name, Mass, Radius, Color, Sun_id) VALUES (@name, @mass, @radius, @color, @Sun_id); END; DECLARE @countSubject INT;EXEC overlay 'Земля' , '40000' , '40000' , 'блакитний' , '1' , @countSubject output PRINT 'Номер планети: ' + CONVERT(VARCHAR, @countSubject); CREATE TRIGGER UpdatePlanetOnUpdateSatelliteON Satellites AFTER UPDATEAS BEGIN UPDATE Planets SET Planets.Mass = Planets.Mass + (INSERTED.Mass - DELETED.Mass), Planets.Radius = Planets.Radius + (INSERTED.Radius - DELETED.Radius) FROM Planets INNER JOIN INSERTED ON Planets.Planet_id = INSERTED.Satallite_id INNER JOIN DELETED ON Planets.Planet_id = DELETED.Satallite_id;END; CREATE TRIGGER UpdateSunnySpaceOnInsertComet ON CometsAFTER INSERT ASBEGIN UPDATE SunnySpace SET Mass = Mass + (SELECT SUM(Mass) FROM inserted), Radius = Radius + (SELECT SUM(Radius) FROM inserted) WHERE Sunnyspace_id = (SELECT Sunnyspace_id FROM inserted); END; CREATE TRIGGER UpdateSunnySpaceMassMeteoritesON Meteorites AFTER INSERTAS BEGIN UPDATE s SET Mass = s.Mass + i.Mass FROM SunnySpace s INNER JOIN inserted i ON s.Sunnyspace_id = i.Sunnyspace_id;END; CREATE TRIGGER RevertPlanetsToInitialState ON PlanetsFOR UPDATE ASBEGIN UPDATE p SET p.Mass = p_backup.Mass, p.Radius = p_backup.Radius, p.Distance_sun = p_backup.Distance_sun, p.Type_planet = p_backup.Type_planet, p.Color = p_backup.Color FROM Planets p INNER JOIN Planets_Backup p_backup ON p.Planet_id = p_backup.Planet_id;END; CREATE INDEX idx_TypePlanet ON Planets (Type_planet); CREATE INDEX idx_MassSatellites ON Satellites (Mass); CREATE INDEX idx_SunID_SunnySpace ON SunnySpace (Sun_id); SELECT t.name AS TableName, i.name AS IndexName, c.name AS ColumnNameFROM sys.tables tINNER JOIN sys.indexes i ON t.object_id = i.object_idINNER JOIN sys.index_columns ic ON i.object_id = ic.object_idINNER JOIN sys.columns c ON ic.column_id = c.column_id AND ic.object_id = c.object_idWHERE t.name IN ('Sun', 'Satellites', 'Planets', 'SunnySpace', 'Comets', 'Meteorites')ORDER BY t.name, i.name; CREATE NONCLUSTERED INDEX idx_Mass_Satellites ON Satellites (Mass) WITH (FILLFACTOR = 80); SELECT OBJECT_NAME(object_id) as table_name, name as index_name, type, type_desc FROM sys.indexesWHERE OBJECT_ID = OBJECT_ID(N'Satellites') AND type_desc = 'NONCLUSTERED'; SELECT nameFROM sys.indexes WHERE OBJECT_ID = OBJECT_ID('Satellites') AND is_primary_key = 1; ALTER TABLE Satellites DROP CONSTRAINT PK__Satellit__Satal__12345678;
Для створення програми в WinForms з підключенням до бази дани SQL Server Management Studio та визначення прав доступу для трьох користувачів (иректор, Адмін та Гість), я б рекомендував рглянути такий підхід:
Створи класи і код на c# в WINFORMS з моїми потребами, які я написав попередньо
Створення програми на WinForms, яка задовольнятиме ваші потреби, включає декілька кроків та компонент: відділення прав доступу, аентифікацію користувача, взаємодію з базою даних та виконання SQL запитів. Нижче наведено приклад базових класів та коду для початку. Цей приклад припускає, що ви вже маєте базове розуміння WinForms та ADO.NET.
UserType
Спочатку створимо перелічення для визначення типів користувачів:
public enum UserType { Director, Admin, Guest }
User
Клас User
містить інформацію про користувача:
public class User { public string Username { get; set; } public string Password { get; set; } public UserType UserType { get; set; } public User(string username, string password, UserType userType) { Username = username; Password = password; UserType = userType; } }
LoginForm
Це проста форма аутентифікації користувача:
public partial class LoginForm : Form { public User AuthenticatedUser { get; private set; } public LoginForm() { InitializeComponent(); } private void loginButton_Click(object sender, EventArgs e) { string username = usernameTextBox.Text; string password = passwordTextBox.Text; // Тут можна додати логіку перевірки імені користувача і пароля. if (username == "Owner" && password == "Owner") { AuthenticatedUser = new User(username, password, UserType.Director); } else if (username == "Admin" && password == "Admin") { AuthenticatedUser = new User(username, password, UserType.Admin); } else if (username != "" && password != "") { AuthenticatedUser = new User(username, password, UserType.Guest); } else { MessageBox.Show("Неправильний логін або пароль!"); return; } this.DialogResult = DialogResult.OK; } }
DatabaseManager
Клас для управління базою даних:
public class DatabaseManager { private readonly string connectionString; public DatabaseManager(string connectionString) { this.connectionString = connectionString; } // Методи для керування базою даних... }
MainForm
Це ваша основна форма, яка запитує користувача, що робити, і взаємодіє з базою даних:
public partial class MainForm : Form { private DatabaseManager databaseManager; private User currentUser; public MainForm() { InitializeComponent(); databaseManager = new DatabaseManager("Ваш connection string"); LoginForm loginForm = new LoginForm(); if (loginForm.ShowDialog() == DialogResult.OK) { currentUser = loginForm.AuthenticatedUser; // Тут код для налаштування інтерфейсу на основі типу користувача... } else { Close(); } } // Методи для обробки дій користувача... }
Зверніть увагу, що це лише скелет програми, що потребує значного розширення і доповнення. Вам потрібно написати додатковий код для:
DatabaseManager
).