Dodawanie ról w nowo utworzonej bazie danych MS SQL dla wbudowanej grupy (np. „Użytkownicy”)

W skrócie: jednym z elementów instalacji programu, który piszę jest wykonanie skryptu, który zakłada bazę, tworzy tabele i dodaje role db_datareader i db_datareader dla użytkowników lokalnych maszyny.

Pierwsza próba:

CREATE USER [BUILTIN\Użytkownicy] FOR LOGIN [BUILTIN\Użytkownicy]
EXEC sp_addrolemember N'db_datareader', N'BUILTIN\Użytkownicy'
EXEC sp_addrolemember N'db_datawriter', N'BUILTIN\Użytkownicy'

Działa, ale tylko w polskiej wersji Windows, bo w angielskiej wersji grupa nazywa się ‚BUILTIN\Users’!

Trzeba więc posłużyć się metodą SUSER_SNAME, która dla SID (Security Id) zwróci nazwę grupy w systemie (w odpowiednim języku).

Poprawiony skrypt wygląda teraz tak:

declare @user sysname
set @user = SUSER_SNAME(0x01020000000000052000000021020000)
exec sp_grantdbaccess @user, @user -- == CREATE USER @user FOR LOGIN @user
EXEC sp_addrolemember N'db_datawriter', @user
EXEC sp_addrolemember N'db_datareader', @user
Reklamy

SQLite, NHibernate i SchemaUpdate

Dowiedziałem się niedawno, że NHibernate ma w namespace NHibernate.Tool.hbm2ddl dwie przydatne klasy: SchemaExport i SchemaUpdate. Pierwsza z nich umożliwia utworzenie struktury bazy danych na podstawie plików mapujących, a druga pozwala uaktualnić strukturę po zmianach mapowania. Napisałem kawałek kodu (jako bazę używałem SQLite), wywołałem odpowiednie metody klasy SchemaExport i struktura się utworzyła. Ale już uaktualnienie nie działało. Procedura się wykonała, żadnych błędów nie było ale i żadna zmiana w bazie danych nie nastąpiła! WTF? Pogooglowałem i okazało się, że z SQLite uaktualnianie struktury po prostu nie działa.

Sprawdziłem ten sam kod z bazą MS SQL – i działa bez problemów.