SQL Server: Jak szybko sprawdzić rozmiary tabel w bazie

CREATE TABLE #rozmiary (
	_name varchar(128),
	_rows int,
	_reserved varchar(18),
	_data varchar(18),
	_index_size varchar(18),
	_unused varchar(18)
)

INSERT INTO #rozmiary exec sp_MSforeachtable "sp_spaceused [?]"

SELECT * FROM #rozmiary ORDER BY _rows DESC

DROP TABLE #rozmiary

Wada – nie podaje przestrzeni nazw w kolumnie _name. Dokumentacja zaleca w takich wypadkach stosowanie sys.dm_db_partition_stats lub sys.dm_db_index_physical_stats

SSRS 2008 – dzień drugi

Walka trwa. Już sporo udało się uruchomić, ale pojawiają się kolejne ciekawostki do ogarnięcia. Dzień drugi jest tu potraktowany dość dowolnie, bo w rzeczywistości rozciągnął się na kilka. Razem z wujkiem Googlem rozwiązujemy kolejne problemy.

Problem 1. Nie działa wysyłka maili subskrybowanych raportów.

Błąd “Failure sending mail: The transport lost its connection to the server.”

Najprawdopodobniej próba wysłania za dużego załącznika Excela. Przy czym “za duży” może być różnie interpretowane. Znalezione rozwiązanie: “zwiększyć dopuszczalny rozmiar wiadomości na serwerze SMTP”. Pierwsza myśl – raczej tu nie ma zastosowania – w moim przypadku maksymalny rozmiar wiadomości to 25MB, załącznik ma 8MB.

Okazało się, że było blisko, ale trzeba szukać gdzie indziej. Akurat serwer SMTP, przez który wysyłamy pocztę jest tylko przekaźnikiem (relay) do właściwego serwera SMTP. Ustawienia rozmiarów wiadomości były bardzo niskie. Zwiększenie do rozmiaru dozwolonego przez główny serwer SMTP oraz zrestartowanie IISa na serwerze-przekaźniku rozwiązało problem.

Błąd “Failure sending mail: At least one of the From or Sender fields is required, and neither was found. Mail will not be resent.”

Wprowadzono alias (np. nazwę użytkownika domenowego) zamiast adresu e-mail: http://support.microsoft.com/kb/945601/pl. Sprawdź zarówno ustawienia subskrypcji jak i konta wysyłającego maile w Reporting Services Configuration Manager, sekcja E-mail settings.

Błąd “The transport error code was 0x800ccc6d. The server response was 552 4.3.1 Message size exceeds fixed maximum message size”

Rozmiar załącznika typu CSV przekracza dozwolony rozmiar ustawiony na serwerze SMTP. Co ciekawe ten błąd wystąpił tylko dla załącznika CSV – dla pozostałych zgłaszał “transport lost”.

Problem 2. Jak przychodzę do pracy i uruchamiam stronę z raportami, to strasznie długo się wczytuje. Potem już jest dobrze. No, prawie dobrze.

W SSRS istnieje pojęcie czasu recyklingu raportów (domyślnie 720 minut). Jest to związane z ogólnym pojęciem appdomain recycling w .NET, ale nie będę teraz tego zgłębiał. Generalnie objawia się to przez wyczyszczenie z pamięci wszystkich ustawień aplikacji. A po restarcie pierwsze uruchomienie wymaga ponownego ich załadowania, co powoduje dłuższy czas oczekiwania.

Rozwiązanie 1: wydłużyć czas recyklingu oraz automat odpalany w nocy, który za nas będzie udawał pierwszego użytkownika: http://www.pawlowski.cz/2011/07/solving-issue-long-starting-report-ssrs-2008/

Rozwiązanie 2: przygotować prosty raport, którego głównym zadaniem będzie uruchamianie się w krótkich odstępach czasu co pozwoli zapobiec restartowi. Patrz: http://social.msdn.microsoft.com/Forums/is/sqlreportingservices/thread/bbaafd07-2897-4b9a-920a-7dbb03047635

Problem 3. Mam w raporcie parametr, który jest listą rozwijaną wielokrotnego wyboru. Chcę, żeby domyślnie były zaznaczone wszystkie wartości (wybranie “Select All”).

Jako wartość domyślną ustaw te same wartości jakie są dostępne w liście wyboru.

Problem 4. Jak tworzę wykres, to jako wartości na nim od razu mi wrzuca albo SUM(), albo COUNT(). Ja nie chcę żadnego agregatu, tylko żeby pokazał mi to, co daję na osi Y.

Obok pola agregatu nacisnąć strzałkę (trójkąt), żeby pokazała się lista rozwijana. Wybrać Expression. Zamiast wartości agregowanej, np. =Count(Fields!Pole.Value) daj samo =Fields!Pole.Value

Problem 5. Eksport do CSV robi to co powinien, czyli oddziela przecinkami. A ja chcę średniki (jak w Excelu), albo nawet tabulator.

W pliku rsreportserver.config odszukaj sekcję Render. Zawiera ona serię wpisów dotyczących renderowania raportów. Zostawiamy istniejący wpis dotyczący CSV i dodajemy drugi, własny:

<Extension Name="CSV 2" Type="Microsoft.ReportingServices.Rendering.DataRenderer.CsvReport,Microsoft.ReportingServices.DataRendering">
    <OverrideNames>
        <Name Language="en-US">CSV (oddzielany srednikiem)</Name>
    </OverrideNames>
    <Configuration>
        <DeviceInfo>
            <FieldDelimiter>;</FieldDelimiter>
        </DeviceInfo>
    </Configuration>
</Extension>

Po kolei:

  • Extension[@Name] – bo każde musi mieć swoją nazwę
  • Type – taki sam jak dla CSV
  • OverrideNames/Name[@language] – chcemy własny opis rozszerzenia renderującego; w moim przypadku język en-US, bo podajemy język systemu operacyjnego
  • Configuration/DeviceInfo/FieldDelimiter – jaki ma być separator

Więcej na temat własnego rozszerzenia renderującego w BOL: Customizing Rendering Extension Parameters in RSReportServer.Config oraz parametry bezpośrednio dla CSV: CSV Device Information Settings.

W przykładzie nie ma polskich liter. Jeśli chcesz ich użyć pamiętaj, żeby zapisać plik jako UTF-8, inaczej będą krzaki.

SSRS 2008 na W2K8. R2.

Piękny tytuł. Ogólnie chodzi o walkę z konfiguracją i spowodowanie działania SQL Server Reporting Services 2008 (R2) na Windows Server 2008 (również R2). Rozpoznanie bojem – uczymy się usługi i kierujemy się zasadą, że ma najpierw działać, a potem będziemy robić żeby było lepiej. Będzie nadal strzelanie skrótami.

Atak 1. Raport stworzony i działający w BIDS nie chce się osadzić (tak będzie po polsku “deploy”?) na serwerze.

“Nie chce się osadzić” może przyjmować różne znaczenia. U mnie to były:

1) Error “The permissions granted to user ‘…’ are insufficient for performing this operation”.
Read more of this post

SQL Server 2008 – dodaj grupę lokalną jako login

Przy zarządzaniu dostępami do SQL Servera możemy dodać grupę użytkowników jako jeden login. Potem ułatwia to zarządzanie – zamiast tworzyć i kasować dostęp do serwera i bazy dla każdego nowego użytkownika wystarczy go dodać lub usunąć z grupy. Jak to się robi – na przykładzie ustawienia lokalnej grupy administratorów serwera jako sysadminów SQL Servera:

USE [master]
GO
CREATE LOGIN [NAZWA_SERWERA\Administrators]
FROM WINDOWS
WITH DEFAULT_DATABASE=[master]
GO

EXEC master..sp_addsrvrolemember
@loginame = N'NAZWA_SERWERA\Administrators',
@rolename = N'sysadmin'
GO

Uruchomienie takich poleceń wygeneruje błąd:

Msg 15401, Level 16, State 1, Line 1
Windows NT user or group 'NAZWA_SERWERA\Administrators' not found. Check the name again.
Msg 15007, Level 16, State 1, Procedure sp_addsrvrolemember, Line 68
'NAZWA_SERWERA\Administrators' is not a valid login or you do not have permission.

Okazuje się, że jeśli chcemy dodać grupę lokalną musimy zamiast nazwy serwera użyć BUILTIN:

USE [master]
GO
CREATE LOGIN [BUILTIN\Administrators]
FROM WINDOWS
WITH DEFAULT_DATABASE=[master]
GO

EXEC master..sp_addsrvrolemember
@loginame = N'BUILTIN\Administrators',
@rolename = N'sysadmin'
GO

I działa.

Follow

Otrzymuj każdy nowy wpis na swoją skrzynkę e-mail.