Loging form z uprawnieniami

Loging form z uprawnieniami
S1
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 11 lat
  • Postów:9
0

Witam, potrzebuje napisać logowanie do bazy danych. Ma ono sprawdzać login i hasło z bazy oraz pobierać poziom uprawnień jaki ma użytkownik (0-admin, 1-nauczyciel,2-uczeń). Jak ugryźć ten temat? Potrafię napisać logowanie z loginem i hasłem. Uprawnienia potrzebne są do otworzenia odpowiedniej formy do której ma dostęp użytkownik. Proszę o pomoc.

XI
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 4 lata
  • Postów:245
0

W bazie danych wypadałoby mieć tabele z rolami (rola spięta z modułami jakie ma ładować do tej roli).
W momencie logowaniu użytkownika sprawdzasz poza loginem i hasłem jeszcze po wiązaniu jak wyżej ładujesz odpowiednie moduły.

S1
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 11 lat
  • Postów:9
0

dopiero się uczę C#, mógł byś napisać przykład jak to zrobić? :)

MI
  • Rejestracja:ponad 15 lat
  • Ostatnio:prawie 9 lat
0

to jest zbyt obrzerny temat, zeby zrobi przykład. Umiesz korzystać z bazy z poziomu C#?

S1
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 11 lat
  • Postów:9
0

tak ;)

Kopiuj
 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
using System.IO;

namespace PDN
{
    public partial class Logowanie : Form
    {
        public Logowanie()
        {
            InitializeComponent();
        }

        public bool trylogin(string username, string pass)
        {
            FileInfo F = new FileInfo("config.dat");
            StreamReader p = new StreamReader("config.dat");
            string server = p.ReadLine();
            string database = p.ReadLine();
            string uid = p.ReadLine();
            string password = p.ReadLine();
            p.Close();
            string mojePolaczenie =
                      "SERVER=" + server + ";" +
                      "DATABASE=" + database + ";" +
                      "UID=" + uid + ";" +
                      "PASSWORD=" + password + ";";
            MySqlConnection con = new MySqlConnection(mojePolaczenie);
            MySqlCommand cmd = new MySqlCommand("select * from test.per where user='" + username + "' and pass='" + pass + "';");
            cmd.Connection = con;
            con.Open();
            MySqlDataReader reader = cmd.ExecuteReader();
            if (reader.Read() != false)
                {
                if (reader.IsDBNull(0) == true)
                {
                    cmd.Connection.Close();
                    reader.Dispose();
                    cmd.Dispose();
                    return false;
                }
                else
                {
                    cmd.Connection.Close();
                    reader.Dispose();
                    cmd.Dispose();
                    return true;
                }
            }
                else
                {
                    return false;
                }
            }
        
        
        
        private void LBT4_Click(object sender, EventArgs e) // przycisk zamykania okna logowania
        {
            Close();
        }

        private void LBT1_Click(object sender, EventArgs e) // przycisk logowania
        {
            if (trylogin(LTB1.Text,LTB2.Text) == true)
            {
                MessageBox.Show("Zalogowany");
                this.Hide();
                    Konsola_Admina KA = new Konsola_Admina();
                    KA.ShowDialog();
            }
            else
            {
                MessageBox.Show("Złe dane");
            }
        }

        private void LBT2_Click(object sender, EventArgs e) // przycisk opcji
        {
            this.Hide();
            Opcje op = new Opcje();
            op.ShowDialog();
        }

        public string mojePolaczenie { get; set; }

        private void LBT3_Click(object sender, EventArgs e)
        {
            this.Hide();
            Dod d = new Dod();
            d.ShowDialog();
        }
    }
}

może mi ktoś doradzić JAK to zrobić w tym?

edytowany 1x, ostatnio: sowa1993
XI
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 4 lata
  • Postów:245
0

Przede wszystkim podziel sobie problem na kilka mniejszych.
0. Zadbać o strukturę kodu. Aktualnie jest byle jaki, bez żadnej konwencji czytanie tego to masakra. Napisałeś, że się dopiero uczysz ok, ale lepiej nabierać dobrych a nie złych nawyków.
Logikę działania aplikacji należy wynieść do osobnych klas, bo za chwilę będziesz miał 1k linii kodu i będziesz tylko scrollował.

  1. Zrobić logowanie użytkowników (na razie wygląda jakbyś miał tylko logowanie adminów),
  2. Zrobić odpowiednią strukturę w bazie:
    2a. Każdy z użytkowników może mieć N przypisanych ról (np. Administrator).
    2b. Każda z ról może mieć przypisanych N uprawnień (Np. Zakładka użytkownicy - Admin).
    2c. (Opcjonalnie) Każde z uprawnień może odpowiadać za N operacji (np. pełny CRUD - czyli 4 operacje)
  3. Sprawdzeniu czy w ogóle masz użytkownika w bazie sprawdzasz listę modułów/zakładek jakie powinieneś mu wczytać/uruchomić/odblokować. (Tu należy jakoś identyfikować zakładki/moduły/kontrolki w GUI).
fourfour
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:627
0
sowa1993 napisał(a):

Witam, potrzebuje napisać logowanie do bazy danych. Ma ono sprawdzać login i hasło z bazy oraz pobierać poziom uprawnień jaki ma użytkownik (0-admin, 1-nauczyciel,2-uczeń). Jak ugryźć ten temat?** Potrafię napisać logowanie z loginem i hasłem**.

Do tabeli użytkowników dodaj pole "uprawnienia", dla każdego użytkownika uzupełnij odpowiednio 0, 1 albo 2. Pobieraj tak samo jak dotychczas, tylko wraz z polem "uprawnienia" (czyli jeśli teraz robisz np. select login, pass from users to daj select login, pass, rights from users).

somekind
Zamiast 0,1 i 2 dałbym 1, 2 i 4.
fourfour
Mas rację, łatwiej to później "obrobić".
S1
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 11 lat
  • Postów:9
0
Xiuthechutli napisał(a):

Przede wszystkim podziel sobie problem na kilka mniejszych.
0. Zadbać o strukturę kodu. Aktualnie jest byle jaki, bez żadnej konwencji czytanie tego to masakra. Napisałeś, że się dopiero uczysz ok, ale lepiej nabierać dobrych a nie złych nawyków.
Logikę działania aplikacji należy wynieść do osobnych klas, bo za chwilę będziesz miał 1k linii kodu i będziesz tylko scrollował.

  1. Zrobić logowanie użytkowników (na razie wygląda jakbyś miał tylko logowanie adminów),
  2. Zrobić odpowiednią strukturę w bazie:
    2a. Każdy z użytkowników może mieć N przypisanych ról (np. Administrator).
    2b. Każda z ról może mieć przypisanych N uprawnień (Np. Zakładka użytkownicy - Admin).
    2c. (Opcjonalnie) Każde z uprawnień może odpowiadać za N operacji (np. pełny CRUD - czyli 4 operacje)
  3. Sprawdzeniu czy w ogóle masz użytkownika w bazie sprawdzasz listę modułów/zakładek jakie powinieneś mu wczytać/uruchomić/odblokować. (Tu należy jakoś identyfikować zakładki/moduły/kontrolki w GUI).

ad 0. wiem że tutaj jest to wszystko wrzucone w jedno, ale nie wiem jak skonstruować te klasy żeby chodziły we wszystkich FORMach jakie mam.
ad 1. na razie jest logowanie zrobione na siłę do jednej formy nie zależnie od poziomu uprawnień.
ad 2a. Administrator będzie miał dostępne wszystko, potem coraz niżej.
ad 3. gdybym wiedział jak to zrobić to by było.
ad 4. dopisze sprawdzanie czy baza jest pusta. Jeżeli tak wyświetli mi się forma dodawania użytkowników, gdzie pierwszy użytkownik wpisany do bazy będzie miał zawsze prawa administracyjne (Administrator systemu).

szogun1987
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 7 lat
  • Lokalizacja:Lublin/Gdynia
1

Poszukaj w necie aspnet_Membership przeczytaj sobie jak on jest zbudowany po co są niektóre elementy i jak już skończysz (pewnie jutro albo w pojutrze) napisz swoje własne logowanie będące wycinkiem tamtego mechanizmu (z ewentualnie dodanymi od siebie elementami).
Co do poprzednich wypowiedzi to to które rozwiązanie wybierzesz jest decyzją architektoniczną:

  1. Możesz dodać 3 kolumny: IsTeacher, IsAdmin, IsStudent - rozwiązanie dobre jeżeli nie będzie więcej ról i mogą się zdarzyć przypadki że ktoś jest jednocześnie nauczycielem i adminem albo nauczycielem i uczniem (np. admin może dodawać nauczycieli ale nie będąc nauczycielem nie może wystawiać ocen). Rozwiązanie bardzo łatwe w implementacji ale może mieć wpływ na komplikacje logiki (o tych łączonych rolach łatwo zapomnieć).
  2. Dodajesz Tabelę Roles, a do użytkownika dodajesz kolumnę RoleId - użytkownik ma tylko jedną rolę, zaletą jest łatwiejsze dodawanie ról - dodajesz rekord bez zmiany struktury danych - u ciebie to nie robi różnicy jednak przy bazach z dużą ilością rekordów jest to problem, uprawnienia weryfikujesz po tym czy dany użytkownik ma rolę o znanym id/kodzie, to podejście wykorzystujesz gdy wiesz, że będą dochodzić nowe role a dodanie każdej z nich i tak będzie wymagało zmian w kodzie (może dojść sprzątaczka która, ma wgląd w swoje sprawy kadrowe ale nie ma możliwości sprawdzania danych klienta, albo sekretarka).
  3. Dodajesz tabele Roles i UserRoles - Jest połączeniem poprzednich dwóch - przy sprawdzaniu dostępu weryfikujesz czy pośród ról użytkownika jest ta której wymagasz, użytkownik może mieć wiele ról - tak jak w przypadku drugim pojawiają się nowe role ale wymagające zmian w kodzie.
  4. Dodajesz tabele Roles, Permissions, RolePermission - Każda rola ma listę swoich uprawnień, w kodzie weryfikujesz czy użytkownik posiada uprawnienie - nie interesują cię role. To czy użytkownik ma uprawnienie wynika z tego do której Roli jest przypisany, może też być przypisany do wielu Ról (wymaga to tabeli UserRoles). Częstą praktyką jest też dodanie tabeli UserPermissions pozwalającej dodać/zabrać uprawnienie konkretnemu użytkownikowi. To rozwiązanie stosuje się w systemach w których będą dochodzić nowe role ale będą one miały podzbiór funkcjonalności już istniejących ról, ewentualnie będą dodawać nowe - dodając rolę nie musisz łazić po kodzie żeby dopisywać ją do wszystkich metod tylko puszczasz skrypt dodający wpisy w bazie/ewentualnie klikasz w module. Rozwiązanie to się sprawdza też w przypadku gdy wdrażasz rozwiązanie w wielu organizacjach (na dużej uczelni może być więcej ról niż w małej szkole wiejskiej).
  5. Bardziej zaawansowane rozwiązania - do tabel autoryzacyjnych może dojść wiele, przykładem jest ww. mechanizm Membership który dokłada tabele Applicatation i Membership(którą można traktować jako UserApplications) pozwalające na jednej bazie trzymać uprawnienia dla wielu aplikacji, takie rozwiązanie sprawdza się gdy masz wiele systemów informatycznych w swojej firmie i chciałbyś żeby było jedno miejsce w którym da się odciąć użytkownika od wszystkich - nie znam aplikacji która rzeczywiście by korzystała z Membership i korzystała z takiej możliwości.

szogun
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Wrocław
0
szogun1987 napisał(a):

Możesz dodać 3 kolumny: IsTeacher, IsAdmin, IsStudent - rozwiązanie dobre jeżeli nie będzie więcej ról i mogą się zdarzyć przypadki że ktoś jest jednocześnie nauczycielem i adminem albo nauczycielem i uczniem (np. admin może dodawać nauczycieli ale nie będąc nauczycielem nie może wystawiać ocen). Rozwiązanie bardzo łatwe w implementacji ale może mieć wpływ na komplikacje logiki (o tych łączonych rolach łatwo zapomnieć).

To rozwiązanie nigdy nie jest dobre, jego efektem są trzy kolumny w większości wypełnione nullami.
To samo można osiągnąć jedną kolumną typu całkowitoliczbowego. Przy założeniu, że np. Admin ma wartość 1, Student 2, a Teacher 4 bez problemu też obsłuży się przypadek, w którym student może być administratorem. Do tego, taką wartość łatwo zmapować na enum, więc obsługa po stronie kodu będzie dość wygodna.
Wadą jest to, że nazwy ról trzyma się wtedy w kodzie aplikacji, no ale w przypadku trzech kolumn bool też tak trzeba.

A bardziej zaawansowanego mechanizmu, z możliwością dodawania ról i uprawnień do każdej funkcji aplikacji przez użytkownika, autorowi chyba nie trzeba.

edytowany 1x, ostatnio: somekind
szogun1987
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 7 lat
  • Lokalizacja:Lublin/Gdynia
0

Po pierwsze nie nullami tylko 0 albo 1, po drugie obsługa maski bitowej zarówno w SQL-u jak i w C# jest mniej czytelna (zwłaszcza gdy nad programem siedzą początkujący programiści albo Hindusi). Pomimo że programuje już swoje znacznie bardziej odpowiada mi czytanie

Kopiuj
if (user.IsAdmin)

niż

Kopiuj
if (((RoleEnum)user.Role & RoleEnum.Admin) == RoleEnum.Admin)

owszem można zrobić wyliczane property ale po co? Skoro po dodaniu 3 kolumn Entity Framework nam je z automatu zmapuje na właściwości.

W SQL-u jest jeszcze gorzej ponieważ operacje bitowe olewają wszelakie indeksy i trzeba stosować ciąg orów, a to jest mało czytelne i generuje koszty związane z przejrzeniem wszystkich zapytań sql-owych w przypadku gdy dojdzie nam dodatkowa rola.
Moim zdaniem tych kilka bajtów na dysku nie jest warte takiej gimnastyki.


szogun
0
szogun1987 napisał(a):

Po pierwsze nie nullami tylko 0 albo 1

nulle zamiast zer po stronie sqla są trochę wygodniejsze
można chociażby napisać

Kopiuj
SELECT
  COUNT(IsAdmin) AS Liczba_adminow,
  COUNT(IsStrudent) AS Liczba_studentow,
  COUNT(IsTeacher) AS Liczba_nauczycieli
FROM tabela

w przypadku wartości 0 / 1 musisz się bawić w wolniejsze case'y

szogun1987
Osobiście zrobiłbym union all i 3 selecty z różnymi Where'ami
1
szogun1987 napisał(a):
Kopiuj
if (((RoleEnum)user.Role & RoleEnum.Admin) == RoleEnum.Admin)

raczej:

Kopiuj
if (user.Role.HasFlag(RoleEnum.Admin))

nic nie stoi na przeszkodzie żeby zrobić getter o nazwie IsAdmin który będzie zawierał ten kod

szogun1987
No ale taką właściwość trzeba napisać i to w dodatku w miejscu które nie zostanie zaorane przez przegenerowanie EF. No i flagi bitowe dalej są niewygodne w SQL.
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Wrocław
0
szogun1987 napisał(a):

Po pierwsze nie nullami tylko 0 albo 1, po drugie obsługa maski bitowej zarówno w SQL-u jak i w C# jest mniej czytelna (zwłaszcza gdy nad programem siedzą początkujący programiści albo Hindusi).

Piszmy wszystko w public static void Main, żeby było łatwiej dla początkujących. ;)

owszem można zrobić wyliczane property ale po co?

Po to, żeby trzymać się zasady DRY i pisać ekspresyjny kod. Właściwość IsAdmin jak najbardziej, ale to nie znaczy, że pod spodem musi to być zmapowane 1:1 do kolumny w tabeli. U mnie obiekty domeny zazwyczaj mają ze 2 razy więcej właściwości niż kolumn ma tabela, na którą są mapowane.

Skoro po dodaniu 3 kolumn Entity Framework nam je z automatu zmapuje na właściwości.

Serio dodana niedawno do EF obsługa code first to jakiś argument? Dla mnie to raczej dowód zacofania M$. ;)

W SQL-u jest jeszcze gorzej ponieważ operacje bitowe olewają wszelakie indeksy i trzeba stosować ciąg orów, a to jest mało czytelne i generuje koszty związane z przejrzeniem wszystkich zapytań sql-owych w przypadku gdy dojdzie nam dodatkowa rola.

Ok. Ale czemu chciałbyś to robić po stronie SQL? Przecież baza danych jest nieświadoma czegoś takiego jak uprawnienia użytkownika zalogowanego do aplikacji.

Moim zdaniem tych kilka bajtów na dysku nie jest warte takiej gimnastyki.

Tu nawet nie chodzi o kilka bajtów na dysku, lecz o łatwość rozbudowy o nowe role bez konieczności zmian w strukturze bazy.

edytowany 1x, ostatnio: somekind
szogun1987
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 7 lat
  • Lokalizacja:Lublin/Gdynia
0

Wkładanie do jednej kolumny rzeczy która powinna być w 3 jest komplikowaniem sobie życia na siłę. Praktycznie nic przez to nie zyskujemy (po za wspomnianymi kilkoma bajtami) a potencjalnie możemy dołożyć wiele roboczo-godzin, podczas diagnozy błędów czy analizy danych.

Po to, żeby trzymać się zasady DRY i pisać ekspresyjny kod. Właściwość IsAdmin jak najbardziej, ale to nie znaczy, że pod spodem musi to być zmapowane 1:1 do kolumny w tabeli. U mnie obiekty domeny zazwyczaj mają ze 2 razy więcej właściwości niż kolumn ma tabela, na którą są mapowane.

Właściwość wyliczana będzie fajna gdy mamy osobną tabelę z rolami (niezależenie czy w relacji 1:n czy n:n) i rzeczywiście tam nam zaoszczędzi nam powtarzalnego kodu. W przypadku gdy info o roli użytkownika znajduje się w wierszu nie widzę żadnej oszczędności ani duplikacji wynikającej z zapisu w jednej kolumnie a widzę koszty.

Serio dodana niedawno do EF obsługa code first to jakiś argument? Dla mnie to raczej dowód zacofania M$. ;)

Jest argumentem. Klepanie z palucha właściwości i kolumn to dopiero naruszenie DRY.

Ok. Ale czemu chciałbyś to robić po stronie SQL? Przecież baza danych jest nieświadoma czegoś takiego jak uprawnienia użytkownika zalogowanego do aplikacji.

Np. bo DB Nazi kazał mi coś wpakować w procedurę żeby się przez noc zdążyło wykręcić? Akurat wątpię żeby ten problem dotyczył tego systemu ale może się tak zdarzyć. poza tym dobrą praktyką jest aby wszelakie listy przeglądowe ładować przy pomocy procedur składowanych(ewentualnie z hurtowni danych które zasila się wynikiem złożonego zapytania SQL-owego).

Tu nawet nie chodzi o kilka bajtów na dysku, lecz o łatwość rozbudowy o nowe role bez konieczności zmian w strukturze bazy.

Na potrzeby coraz większej elastyczności podałem kolejne podejścia.


szogun
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Wrocław
1
szogun1987 napisał(a):

Wkładanie do jednej kolumny rzeczy która powinna być w 3 jest komplikowaniem sobie życia na siłę. Praktycznie nic przez to nie zyskujemy (po za wspomnianymi kilkoma bajtami) a potencjalnie możemy dołożyć wiele roboczo-godzin, podczas diagnozy błędów czy analizy danych.

Poza bajtami zyskujemy możliwość dodawania nowych ról bez zmiany schematu. Jeśli ktoś potrafi coś spierniczyć przy wywoływaniu metody Enum.HasFlag, to lepiej żeby w ogóle się za programowanie nie brał. A wiele roboczogodzin podczas debugowania tracą tylko ci, którzy nie piszą testów.

Właściwość wyliczana będzie fajna gdy mamy osobną tabelę z rolami (niezależenie czy w relacji 1:n czy n:n)

Co to jest "relacja 1:n"? Bo na pewno nic związanego z bazami danych.

W przypadku gdy info o roli użytkownika znajduje się w wierszu nie widzę żadnej oszczędności ani duplikacji wynikającej z zapisu w jednej kolumnie a widzę koszty.

W każdym przypadku, nawet najprostszej operacji warto wydzielać duplikujący kod do metod/właściwości.

Jest argumentem. Klepanie z palucha właściwości i kolumn to dopiero naruszenie DRY.

Inne ORMy miały to już tysiąc lat temu, więc chwalenie się tym, że EF też to w końcu obsługuje jest dziwne.

Np. bo DB Nazi kazał mi coś wpakować w procedurę żeby się przez noc zdążyło wykręcić? Akurat wątpię żeby ten problem dotyczył tego systemu ale może się tak zdarzyć. poza tym dobrą praktyką jest aby wszelakie listy przeglądowe ładować przy pomocy procedur składowanych(ewentualnie z hurtowni danych które zasila się wynikiem złożonego zapytania SQL-owego).

Dzięki, ale nie pytałem o zastosowania procedur ani o dobre praktyki ich stosowania. Ja chciałbym wiedzieć, jaki związek mają procedury z systemem autoryzacji w aplikacji. Bo oczywiste jest podejście polegające na tym, że aplikacja dopuszcza użytkownika w danej roli do wykonania jakiejś akcji, a ta akcja wewnętrznie korzysta z procedury. Ale jak niby procedura ma sprawdzić, czy użytkownik aplikacji ma prawo do jej wykonania? jak do procedury przekazujesz kontekst zalogowanego użytkownika?

Na potrzeby coraz większej elastyczności podałem kolejne podejścia.

Które mają sens raczej w większych systemach, z dużo bardziej skomplikowanym przepływem sterowania. Mój pomysł to po prostu pewien kompromis prostoty i elastyczności. Nie nadaje się do każdej aplikacji, ale w wielu się sprawdzi. Myślę, że enum ma sens w każdej sytuacji, w której jest więcej niż jedna rola (bo dla jednej faktycznie wystarczy kolumna IsAdmin), i w której nie ma potrzeby, aby użytkownicy aplikacji mogli konfigurować uprawnienia do akcji. Jedna kolumna zawsze jest prostsza i wydajniejsza niż trzy tabele.

szogun1987
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 7 lat
  • Lokalizacja:Lublin/Gdynia
0

Poza bajtami zyskujemy możliwość dodawania nowych ról bez zmiany schematu. Jeśli ktoś potrafi coś spierniczyć przy wywoływaniu metody Enum.HasFlag, to lepiej żeby w ogóle się za programowanie nie brał. A wiele roboczogodzin podczas debugowania tracą tylko ci, którzy nie piszą testów.

Jeszcze więcej tracą ci którzy zaciemniają kod na siłę

Co to jest "relacja 1:n"? Bo na pewno nic związanego z bazami danych.

1:1 jest dla mnie relacją wykorzystywaną w niektórych systemach do modelowania dziedziczenia w której występuje primary foreign key. mówiąc 1:n zaznaczam że nie chodzi mi o tamto rozwiązanie

W każdym przypadku, nawet najprostszej operacji warto wydzielać duplikujący kod do metod/właściwości.

Te właściwości są bliskoznaczne ale nie jednoznaczne nie ma duplikacji

Inne ORMy miały to już tysiąc lat temu, więc chwalenie się tym, że EF też to w końcu obsługuje jest dziwne.

Odbiegasz od tematu. To nie jest wychwalanie EF tylko stwierdzenie że jedna bezsensowna kolumna utrudnia z niego korzystanie.

Dzięki, ale nie pytałem o zastosowania procedur ani o dobre praktyki ich stosowania. ... jak do procedury przekazujesz kontekst zalogowanego użytkownika?

Nie przekazuję ale mogę chcieć mieć raport zliczający pewne fakty w podziale na Role. W przypadku 3 kolumn zapytanie jest dużo czytelniejsze a często i wydajniejsze.

To rozwiązanie nie jest kompromisem, jest rzucaniem sobie klocków lego pod nogi, niby przejście po nich nie jest problemem nie jest jednak przyjemne.


szogun
edytowany 1x, ostatnio: szogun1987
XI
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 4 lata
  • Postów:245
0

Nie przekazuję ale mogę chcieć mieć raport zliczający pewne fakty w podziale na Role. W przypadku 3 kolumn zapytanie jest dużo czytelniejsze a często i wydajniejsze.

W przypadku jednej kolumny możemy skorzystać z GROUP BY i coś mi się wydaje, że zapytanie będzie jednak czytelniejsze w formie:
GROUP BY RoleId :)

szogun1987
Nie jeżeli GroupId jest maską bitową.
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Wrocław
0
szogun1987 napisał(a):

Jeszcze więcej tracą ci którzy zaciemniają kod na siłę

Pracowałem już przy kilku systemach, w których model ról był oparty na enumie po stronie aplikacji oraz jednej kolumnie w bazie, i nikt na to nie narzekał. Dla wszystkich był to prosty i oczywisty mechanizm, nikt nie narzekał, nikt nie postulował, żeby to rozbić na wiele kolumn. Bo 20, a nawet 10 dodatkowych kolumn Is* w tabeli to dopiero jest zaciemnienie.

1:1 jest dla mnie relacją wykorzystywaną w niektórych systemach do modelowania dziedziczenia w której występuje primary foreign key. mówiąc 1:n zaznaczam że nie chodzi mi o tamto rozwiązanie

Aha, czyli Ty też jesteś z tych, którzy nie wiedzą czym jest relacja. W porządku.

Odbiegasz od tematu. To nie jest wychwalanie EF tylko stwierdzenie że jedna bezsensowna kolumna utrudnia z niego korzystanie.

W żaden sposób nie utrudnia, nawet z EF. Właściwość mapuje się 1:1 z kolumną + ewentualnie dopisuje właściwości wyliczane.
Czy właściwość FullName, która jest konkatenacją FirstName i LastName też zapisujesz do bazy, bo łatwiej?

Nie przekazuję ale mogę chcieć mieć raport zliczający pewne fakty w podziale na Role. W przypadku 3 kolumn zapytanie jest dużo czytelniejsze a często i wydajniejsze.

Co prawda trudno mi sobie wyobrazić sensowny raport, na którym mogłyby się znaleźć dane z tak różnych ról, ale ok - to jest przypadek, w którym oddzielne kolumny będą lepsze.

To rozwiązanie nie jest kompromisem, jest rzucaniem sobie klocków lego pod nogi, niby przejście po nich nie jest problemem nie jest jednak przyjemne.

To, że czegoś nie lubisz stosować nie znaczy, że jest obiektywnie złe. To tylko Twoja osobista opinia.

szogun1987
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 7 lat
  • Lokalizacja:Lublin/Gdynia
0

Posiadanie 10-20 Is* oznacza przegapienie momentu w którym powinno się przejść na osobne tabele. Inna sprawa że idąc w ilość to twoja metoda się skończy na 31 (32 jak wejdziemy na liczby ujemne) roli podejście z Is* przy tysięcznej.

Aha, czyli Ty też jesteś z tych, którzy nie wiedzą czym jest relacja. W porządku.

To może mnie oświecisz?


szogun
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Wrocław
0
szogun1987 napisał(a):

Posiadanie 10-20 Is* oznacza przegapienie momentu w którym powinno się przejść na osobne tabele. Inna sprawa że idąc w ilość to twoja metoda się skończy na 31 (32 jak wejdziemy na liczby ujemne) roli podejście z Is* przy tysięcznej.

Jeśli użyć biginta to nawet 64 a jeśli uniqueidentifier to i 128. :P No, ale to już jest oczywista przesada.

To może mnie oświecisz?

1:n, n:n, 1:1 to są powiązania, nie relacje. W relacyjnych bazach danych relacjami są tabele.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)