SQL: Uprawnienie db_owner bez usuwania bazy danych

2019-08-09

Sam nie wiem z czego to wynika, ale uzytkownicy proponuja czasami nieco abstrakcyjne rozwiazania zwiazane z ustawieniem uprawnien do bazy danych.

W tym przypadku klient chcial aby uzytkownicy bazy danych mogli pracowac na poziomie uprawnien db_owner, ale z jednym malym haczykiem. Uzytkownicy nie powinni moc usunac bazy danych. Dlaczego uwazam, ze zyczenie jest nieco abstrakcyjne? Otoz db_owner to bardzo wysokie uprawnienie, wiec zlosliwy uzytkownik moze:

  • pousuwac tabele
  • zmodyfikowac procedury
  • zabrac uprawnienia innym uzytkownikom
  • itp.

Wydaje sie ze lepszym rozwiazaniem byloby wybranie tylko tych uprawnien, ktore sa rzeczywiscie potrzebne i nadanie ich do roli bazy danych. Potem uzytkownikow wystarczy przypisywac do tej roli. Byloby bezpieczniej.

No ale… usuniecie bazy danych jak opisano w https://docs.microsoft.com/en-us/sql/t-sql/statements/drop-database-transact-sql?view=sql-server-2017 moze byc wykonane tylko w 3 przypadkach:

  • uzytkownik ma upranienie ALTER ANY DATABASE
  • uzytkownik ma uprawnienie CONTROL
  • uzytkownik jest db_ownerem

Requires the CONTROL permission on the database, or ALTER ANY DATABASE permission, or membership in the db_owner fixed database role.

Skoro u nas uzytkownik jest db_ownerem, to mozna mu zabrac uprawnienie do kasowania bazy tylko na 2 sposoby:

  • deny alter any database to user_name
  • deny control on database::db_name to user_name

Czytaj dalej »

By Rafał Kraik in SQL

Windows: Cluster: Ukryty zasob sieciowy C:\ClusterStorage

2019-08-09

Podczas instalacji Windows Failover Cluster na nodach clustra tworzony jest udostpniony zasob wskazujacy na C:\ClusterStorage

Takie „ukryte” zasoby sa czesto wychwytywane przez osoby pilnujace bezpieczenstwa serwerow, tymczasem ten powinien byc od razu wciagniety na white-list. Katalog ten pozwala w clustrze sledzic wykorzystanie Cluster Shared Volume (CSV), co jest dokladniej opisane na stronie Microsoft:

https://docs.microsoft.com/en-us/windows-server/failover-clustering/failover-cluster-csvs

R #07 – eksport wykresu do pliku – tutorial

2019-07-14

To dobrze móc wygenerować wykres w środowisku programistycznym, ale jeśli te wykresy mają np. dalej podlegać publikowaniu w intranecie i chciałoby sie aby te wykresy były zawsze aktualne, wtedy przyda się eksportowanie danych do pliku. Skrypt będzie można uruchamiać batchowo, bez udziału człowieka, a jednym z zadań skryptu będzie aktualizacja pliku.

W  pierwszym kroku należy otworzyć nowe urządzenie. Tym urządzeniem będzie teraz plik PNG o zdefiniowanej wysokości, szerokości i rozdzielczości. Po otwarciu urządzenia, rysowanie wykresu będzie się odbywać właśnie tam. Wobec tego uruchomienie polecenia plot, nie spowoduje narysowania czegokolwiek na ekranie. Wszystko będzie odbywać się w pliku graficznym. Ostatnim poleceniem jest zamknięcie urządzenia za pomocą dev.off():

png('c:/temp/chicken_chart.png', width = 500, height = 350, res = 72)

plot(x=1:nrow(chickwts), y=chickwts$weight,
 col=color_column, pch = shapes_column,
 xlab = 'Chicken', ylab = "Chicken's weight")

legend("topleft", legend = levels(chickwts$feed),
 col = my_colors,
 pch = my_shapes )

dev.off()

 

By Rafał Kraik in R

R #06 – kompozycja wykresów – tutorial

2019-07-14

Zależnie od sytuacji, czasami chcemy mieć duży i dokładny wykres, co pozwala dokłądnie przyjrzeć się poszczególnym elementom wykresu. Innym razem zadowolisz się po prostu ogólną znajomością sytuacji i wtedy przyda się kilka wykresów na raz prezentujących różne zależności, chociaż zdecydowanie mniejszych i mniej dokładnych.

W języku R za układ wykresu odpowiada kilka parametrów sesji. Możesz je wyświetlić korzystając z polecenia:

par()

Aby przekonfigurować środowisko tak, aby na raz pojawiały się 3 wykresy ułożone poziomo jeden nad drugim wykonaj polecenie:

par(mfrow=c(3,1))

Teraz pozostaje rysować wykresy:

barplot(feed_mean,
 main="Average chicken weight depending on feed",
 ylab="weight",
 xlab="feed type")

hist(ord_chick$weight, breaks = 10, ylim=c(0,10),
 ylab="Number of chickens", xlab="Chicken's weight")

barplot(data = chickwts,height = chickwts$weight,
 col=color_column, pch = shapes_column)

Czytaj dalej »

By Rafał Kraik in R

R #05 – wykres słupkowy i wartości średnie – tutorial

2019-07-14

W jednym z poprzednich wpisów pokazywałem, jak zbudować wykres słupkowy. Narzekaliśmy jednak na to, że słupków było tyle, co danych, a tymczasem często chciałoby się je uogólnić. Wszystkie próbki odpowiadające jednej kategorii do zaprezentowania na wykresie można uogólnić np. wyznaczając dla nich średnią.

W tym przykładzie nadal pracujemy z informacjami o wadze kurczaków w zależności od karmy, jaką im podawano. Aby rozpocząć rysowanie przygotujemy w odpowiedni sposób dane. Zostaną one podzielone na kategorie ze względu na rodzaj karmy, a potem dla każdej z tych grup wyliczymy wartość średnią:

feed_mean= tapply(chickwts$weight, chickwts$feed, mean, na.rm=T)
feed_mean

 casein horsebean linseed meatmeal soybean sunflower 
 323.5833 160.2000 218.7500 276.9091 246.4286 328.9167

Teraz można przystąpić do rysowania wykresu:

barplot(feed_mean,
 main="Average chicken weight depending on feed",
 ylab="weight",
 xlab="feed type")

Czytaj dalej »

By Rafał Kraik in R

R #04 – wykres pudełkowy – tutorial

2019-07-14

Na początku wiele rzeczy wydaje się prostych, a z czasem kiedy je analizujemy dochodzimy do drugiego dnia. Potem do trzeciego, potem do czwartego… Im dalej tym bardziej zaawansowane narzędzia są potrzebne.

boxplot(weight ~ feed, data = chickwts, varwidth = TRUE, notch=TRUE,
 col='gray')

Czytaj dalej »

By Rafał Kraik in R

R #03 – wykres histogram – tutorial

2019-06-28

W poprzednich atrukułach zobaczyłeś jak stworzyć wykres punkowy i wykres słupkowy. Każdy z tych wykresów zajmował się w miarę najdokładniejszym odwzorowaniem oryginalnych danych, o żadnej agregacji nie było w nich mowy.  Małym krokiem w stronę uogólnienia danych jest budowanie histogramu. Jego zastosowanie to z jednej strony przedstawienie z jakimi danymi mamy do czynienia, a z drugiej strony pozwala niekiedy ocenić, czy dane są dobrane rzetelnie, czy  wybrana próbka testowa dobrze prezentuje całą populację.

Do utworzenia wykresu histogramu dane trzeba odpowiednio przygotować – sortujemy zbiór danych ze względu na właściwość/cechę, która ma być prezentowana – tutaj jest to waga kurczaka

ord_chick = chickwts[order(weight),]

Teraz można już rysować histogram:

hist(ord_chick$weight, breaks = 5)

Czytaj dalej »

By Rafał Kraik in R