SQL Server 2012 – Funkcja FORMAT

By Pawel Potasinski on Czerwiec 30th, 2012

Jedną z ciekawiej zapowiadających się nowości w języku Transact-SQL (T-SQL) w SQL Server 2012 była funkcja FORMAT. Wspomniał o niej choćby Marcin Nowakowski opisując nowe funkcje skalarne w najnowszej odsłonie systemu SQL Server.

FORMAT daje spore możliwości tworzenia ciągów znakowych sformatowanych według zadanego wzorca zgodnego z wybraną notacją narodową (np. wybór formatowania “pieniężnego” dla narodowości pl-PL, da nam ciąg znaków przedstawiających liczbę z walutą zł). Przykłady poniżej:

DECLARE
  @date date = '20120629',
  @money money = 1234567.89,
  @number int = 1,
  @percent numeric(2,1) = 0.3;
 
-- 29 czerwca 2012
SELECT FORMAT(@date, 'D', 'pl-PL');
 
-- piątek, 29 czerwca 2012
SELECT FORMAT(@date, 'dddd, dd MMMM yyyy', 'pl-PL');
 
-- Pt, 29.06.2012
SELECT FORMAT(@date, 'ddd, dd.MM.yyyy', 'pl-PL');
 
-- 1 234 567,89 zł
SELECT FORMAT(@money, 'C2', 'pl-PL');
 
-- 000001
SELECT FORMAT(@number, 'D6', 'pl-PL');
 
-- 30,00%
SELECT FORMAT(@percent, 'P2', 'pl-PL');

Wygląda ciekawie? Tak samo pomyślałem i pewnie będą sytuacje, w których ta funkcja się znajdzie zastosowanie. Warto zatem zapoznać się z dokumentacją funkcji oraz opisem szablonów formatujących, które są żywcem wzięte z technologii .NET.

Z dokumentacji funkcji dowiadujemy się m.in., że:

FORMAT relies on the presence of .the .NET Framework Common Language Runtime (CLR).

Czyli jest tam gdzieś pod spodem używana technologia .NET. Cudów nie ma. Postanowiłem sprawdzić, jaki to może mieć wpływ na wydajność.

Do testów na instancji SQL Server 2012 + CU2 (build 11.0.2325) zainstalowanej na laptopie (8 GB RAM, z czego 4 GB RAM dla SQL Servera, Intel Core i7) użyłem bazy AdventureWorksDW2012. Wykonywałem operacje prowadzące do produkowania tych samych wyników metodami znanymi z poprzednich wersji systemu SQL Server oraz za pomocą funkcji FORMAT. Skrypt do testów:

USE AdventureWorksDW2012;
GO
 
-- Test 1: padding
 
SET STATISTICS TIME ON;
GO
 
SELECT RIGHT('000000' + CONVERT(varchar(10), SalesOrderLineNumber), 6)
FROM dbo.FactInternetSales;
SELECT FORMAT(SalesOrderLineNumber, 'D6')
FROM dbo.FactInternetSales;
GO
 
SET STATISTICS TIME OFF;
GO
 
-- Test 2: numbers
 
SET STATISTICS TIME ON;
GO
 
SELECT CONVERT(varchar(20), SalesAmount, 1)
FROM dbo.FactInternetSales;
SELECT FORMAT(SalesAmount, 'N2')
FROM dbo.FactInternetSales;
GO
 
SET STATISTICS TIME OFF;
GO

Wyniki:

  • Test 1 – padding:
    • metoda klasyczna: CPU time = 0 ms,  elapsed time = 311 ms
    • metoda wykorzystująca funkcję FORMAT: CPU time = 1919 ms,  elapsed time = 2259 ms
  • Test 2 – numbers:
    • metoda klasyczna: CPU time = 15 ms,  elapsed time = 282 ms
    • metoda wykorzystująca funkcję FORMAT: CPU time = 2075 ms,  elapsed time = 2450 ms

Wniosek – funkcja FORMAT oferuje ciekawe możliwości, ale należy unikać stosowania jej tam, gdzie jesteśmy w stanie osiągnąć analogiczny wynik funkcjami “czysto T-SQL-owymi” (np. CONVERT). I raczej wypada stosować tę funkcję do produkowania pojedynczych napisów niż dużych zbiorów wartości. Oczywiście, może się okazać, że kryterium wydajności nie będzie dla nas najważniejsze i górę wezmą przyzwyczajenia z programowania w językach .NET lub po prostu wygoda. Podobnie, dla jednorazowo wykonywanych operacji, w których czas wykonania zadania nie jest priorytetem, funkcja ta może być bardzo przydatna. I wreszcie, jeśli w grę wchodzi generowanie wartości “nacjonalizowanych”, zastosowanie funkcji FORMAT wydaje się być najlepszym rozwiązaniem.

Fin de siecle II

By Paweł Goleń on Czerwiec 29th, 2012

Jakiś mroczny psuj grasuje w moim sprzęcie komputerowym. Wczoraj mój laptop postanowił przestać podświetlać matrycę. Albo inaczej – samo podświetlanie działa, ale błyskawicznie się wyłącza. Jeśli dobrze posłuchać, to można usłyszeć ten charakterystyczny „śpiewający” dźwięk padającej elektroniki, a w chwili wyłączenia matrycy – pyknięcie.

Trochę mnie ta sytuacja irytuje. Nie mam ochoty w tej chwili kupować całkiem nowego laptopa. Wolałbym na spokojnie zorientować się jakie są w tej chwili możliwości. Z drugiej strony ciągła naprawa starego może spowodować, że koszty napraw przekroczą jego wartość rynkową, która w tej chwili za wysoka już nie jest.

Rzuciłem okiem na oferty laptopów poleasingowych, jest kilka interesujących modeli (np. T61), również w cenie, którą byłbym skłonny wydać. Ale ja trochę wybredny jestem. Mam jakieś dziwne wymagania odnośnie matrycy. Na przykład matryca mająca mniej niż 1050 pikseli w pionie jest z mojego punktu widzenia mała, a większość laptopów dysponuje rozdzielczością rzędu 800 lub 900 pikseli. Druga kwestia, pod jaką jestem dziwny, to system operacyjny. Nie, nie chodzi o to, że chcę Windows (najlepiej Windows 7), ale bardziej o to, że chcę ten system w wersji Professional i oczywiście angielskiej wersji językowej. I to jest kolejny problem, bo nawet jeśli gdzieś taki system jest dostępny (nawet do dokupienia w ramach Microsoft Refurbisher), to zwykle (zawsze?) jest on w wersji polskiej… Problem można co prawda rozwiązać, ale pomarudzić sobie mogę.

Swoje do powiedzenia ma również moje lenistwo. Nie ukrywam, że nie chce mi się stawiać systemu, instalować oprogramowania, przenosić danych…

Model uprawnień w Sharepoint

By Szymon Bochniak on Czerwiec 29th, 2012

Na łamach bloga Office 365 publikowałem ostatnio serię prezentacji wideo przedstawiających dokładne omówienie modelu uprawnień w usłudze SharePoint Online. Jako, że model ten pokrywa się w 80% z tradycyjną edycja SharePoint i jest on omówiony w bardzo przystępny sposób zachęcam do zapoznania się z serią.

Seria omawia:

  • Wprowadzenie do modelu uprawnień
  • Dodawanie użytkowników i nadawanie uprawnień
  • Możliwości dotyczące zarządzaniem uprawnieniami
  • Dziedziczenie uprawnień
  • Uprawnienia typu – Dostęp ograniczony
(…)
Czytaj całośćModel uprawnień w Sharepoint (0 words)


© admin for SharePoint Blog, 2012. |
Permalink |
Nikt jeszcze nie skomentował tego wpisu |
Add to
del.icio.us

Post tags: , , , ,

Błąd z dostępem do CRM Online – “Your organization has moved”

By Jakub (Kuba) Skałbania on Czerwiec 29th, 2012

Ostatnio pojawiły się błędy z dostępem do CRM Online. Użytkownicy nie mogą się zalogować, a część z nich może losowo dostawać komunikat “Your organization has moved“. Oczywiście nie ma co panikować – nikt nie przeniósł, ani nie usunął danych .

Microsoft jest świadomy tego błędu i od razu przygotował sposób jego rozwiązania, aby zminimalizować jego skutki. Tutaj jest KB, które tłumaczy jak obejść problem http://support.microsoft.com/kb/948661. Na początku KB było tylko dla użytkowników centrów danych w USA, ale już wiadomo, że działa także w Europie.

Filed under: błąd, CRM Online, problem

Updates: Autoruns v11.32, Process Explorer v15.21, Process Monitor v3.02, PSKill v1.15, RAMMap v1.2

By safarr_msft1 on Czerwiec 28th, 2012

Autoruns v11.32: This update fixes a bug that prevented Autoruns from correctly elevating when the Run as Administrator option is selected.

Process Explorer v15.21: This update fixes a bug related to the autostart functionality introduced in v15.2, a tooltip display bug, and a bug that prevented display of kernel stacks.

Process Monitor v3.02: This release fixes an external logging issue that prevented certain registry paths from display correctly when run with App-V and fixes a bug in the save logic.

PsKill v1.15: This fixes a bug in the remote kill functionality introduced  by the v1.14 update.

RAMMap v1.2: This release to RAMMap, a utility that displays a detailed map of a system’s physical memory usage, now supports systems with more than 16GB of RAM, Windows 8, and includes keyboard navigation improvements.

Nowy OneDrive już wkrótce!

By Szymon Bochniak on Czerwiec 28th, 2012

Office 365 gwarantuje dostęp do najnowszych rozwiązań technologicznych. Microsoft zapowiedział na styczeń duże zmiany w OneDrive For Business!

Continue Reading

Trochę inne OR 1=1 —

By Paweł Goleń on Czerwiec 27th, 2012

Punkt A1 Injection nie dotyczy tylko błędów typu SQL Injection. Coraz częściej dostęp do danych jest realizowany za pośrednictwem jakiejś warstwy abstrakcji (np. ORM). Użycie tego typu rozwiązań nie gwarantuje odporności na błędy typu injection, np. CWE-564: SQL Injection: Hibernate.

Jest jednak pewna różnica między możliwością wstrzyknięcia kodu, a osiągnięciem w ten sposób jakiegoś sensownego rezultatu. Bardzo często jest tak, że język zapytań wspomnianej warstwy pośredniej jest ograniczony, atakujący może dużo mniej, niż w przypadku błędu SQL Injection. Jeśli ktoś jest przyzwyczajony do tego, że injection daje pełen dostęp do bazy danych (co najmniej w trybie do odczytu), a czasami i więcej, takie ograniczone skutki podatności mogą trochę rozczarowywać. Czasami tym, co chcemy osiągnąć, jest uzyskanie dostępu do danych innych użytkowników. Pozytywne (dla atakującego) jest to, że jesteśmy w stanie to osiągnąć. Przynajmniej w większości wypadków.

Zacznijmy od pewnego powtarzalnego wzorca, który się pojawia w zapytaniach, niezależnie od tego, na czym to zapytanie operuje (SQL, XML, …). W tym wzorcu parametry zapytania podzielone jest często na dwie części. Pierwsza część ogranicza wyszukiwanie do tych danych, do których użytkownik ma dostęp, w drugiej części zapytania przekazywane są natomiast parametry wyszukiwania, te właściwe. Wygląda to mniej więcej tak (umówmy się, że to jest sekcja WHERE zapytania):

(OwnerID = 1 AND SomeOtherField = 2) AND ((BodyText LIKE '%test%' OR Subject LIKE '%test%') AND Type = 1)

W praktyce może być tak, że OwnerID zawiera identyfikator użytkownika, do którego dany rekord należy, a pole SomeOtherField jest jakimś innym „ogranicznikiem”. Może to być na przykład poziom dostępu konkretnego użytkownika do danych.

Dla lepszego zrozumienia możemy przyjąć, że OwnerID jest identyfikatorem klienta w jakiejś aplikacji „chmurowej”, natomiast SomeOtherField jest poziomem dostępu aktualnie zalogowanego użytkownika tego klienta.

Załóżmy, że mamy injection w parametrze, który jest wstawiany do LIKE. Jak uzyskać dostęp do danych innych użytkowników?

W normalnej sytuacji byłoby to dość proste. Wystarczyłoby przekazać payload następującej postaci:

 ')) OR 1=1 --

Wówczas sekcja WHERE zapytania przyjęłaby mniej więcej taką postać:

(OwnerID = 1 AND SomeOtherField = 2) AND ((BodyText LIKE '%')) OR 1=1 -- %' OR Subject LIKE '% ')) OR 1=1 -- %') AND Type = 1)

Efektywnie zapytanie byłoby jednak krótsze, bo jego część zostaje wykomentowana:

(OwnerID = 1 AND SomeOtherField = 2) AND ((BodyText LIKE '%')) OR 1=1

Jaki jest rezultat tego zapytania? Zwracane są wszystkie rekordy z danej tabeli, bo decydujące znaczenia ma tutaj warunek 1=1, który jest tautologią.

A teraz niespodzianka. Nie zawsze można po prostu wykomentować pozostałą część zapytania, bo na przykład język wykorzystywanej warstwy abstrakcji po prostu nie wspiera komentarzy (patrz: Does JPQL have single- and/or multi-line comments?). Co zrobić?

Oczywiście nie pozostaje nic innego, jak wymyślić inny payload, który zmodyfikuje warunki wyszukiwania w tautologię, ale bez konieczności wykorzystywania komentarza. Dla ułatwienia zacznijmy od czegoś takiego:

(OwnerID = 1 AND SomeOtherField = 2) AND ((BodyText LIKE '%$injection%' OR Subject LIKE '%$injection%') AND Type = 1)

Musimy uciec z podwójnych nawiasów, a potem do nich wrócić. Musimy też stworzyć „wolną” sekcję OR, która zwraca zawsze true niezależnie od pozostałych części zapytania. Przykład:

')) OR 1=1 OR (('%'='

Co dzieje się po przekazaniu takiego payloadu (dla ułatwienia – połamane zapytanie):

(OwnerID = 1 AND SomeOtherField = 2) AND 
((BodyText LIKE '%')) OR 
1=1 OR 
(('%'='%' OR Subject LIKE '%')) OR 
1=1 OR 
(('%'='%') AND Type = 1)

Przede wszystkim trzeba sprawdzić, czy nawiasy się zgadzają. W pierwszej linii mamy jeden otwierający, jeden zamykający. Jest więc OK. W drugiej linii są dwa nawiasy otwierające, dwa zamykające. Wygląda to brzydko, ale składniowo jest poprawne. Taka sama sytuacja jest w czwartej i szóstej linii. W linii trzeciej i piątek mamy natomiast nasze tautologie. Cały warunek będzie więc prawdziwy, a w rezultacie dostaniemy dostęp do wszystkich danych z danej tabeli.

Prawda, że oczywiste? Trzeba jednak przyznać, że strzelanie „w ciemno” z zapytaniem może być skomplikowane. Jeśli nie wiemy jak skonstruowane jest zapytanie, to wstrzelenie się z payloadem, który po wstrzyknięciu da prawidłowe zapytanie, nie jest zadaniem trywialnym.

Simple DB Application

By Grzesiek Bartosik on Czerwiec 27th, 2012

W trakcie przygotowań do sesji SQL Server High Availability w trzech (a może i więcej) aktach. Akt drugi: Database Mirroring poszukiwałem w sieci prostej aplikacji (nawet konsolowej), której zadaniem byłoby wykonanie prostego zapytania na bazie danych. Oczywiście wujek Google mówił dużo, ale nie zawsze trafnie, więc chwila moment i powstało kilka linijek wszystkorobiącego kodu w C# ;-).

Continue Reading

W drodze do Sydney (światowe finały Imagine Cup 2012)

By Tadeusz on Czerwiec 27th, 2012

Razem z zespołem Armed z Wojskowej Akademii Technicznej w Warszawie będę miał okazję śledzić w Sydeny światowe finały konkursu ImagineCup 2012. To już 10-ta, jubileuszowa edycja Imagine Cup.

Konkurs zacznie się w czwartek 6 lipca i potrwa poniedziałku 9 lipca (prezentacje najlepszych 6-ciu finalistów). Prezentacja laureatów (miejsce 1-3) będzie miało miejsce we wtorek 10 lipca w trakcie tzw. World Festival.
A właściwie to finał już się zaczął. W kategorii Projektowanie Oprogramowania zespoły miały przygotować film z prezentacją, którą jurorzy przed przyjazdem do Sydney ocenią. Oto filmik przygotowany przez zespół Armed.

Ta właściwa, konkursowa prezentacja potrwa 20 minut i będzie trochę inna. Myślę, że w trackie pobytu w Australii będę mógł ją tu też zaprezentować. Trzymajcie kciuki za polskie zespoły na światowych finałach Imagine Cup.
O tym, czy zespół Armed zakwalifikuje się do kolejnej rundy będziemy wiedzieć w sobotę, 7 lipca w południe polskiego czasu.

Hyper-V z CSV cd…

By nExoR on Czerwiec 27th, 2012

w końcu wszystko zahulało i od dwóch dni mam świetną zabawę testując czasy przenoszenia maszyn. nie tracą nawet pojedynczego pinga (: średnia prędkość kopiowania przy LM: 3ooMbps. teraz tydzień-dwa testów – ale wygląda na to, że osiągnąłem stabilizację środowiska.

co było nie tak, że CSV się wieszał? nie znalazłem finalnej odpowiedzi ale kilka wskazówek:

  • znalazłem ciekawy art, w którym jest opisane podobne zachowanie – nie mój scenariusz ale warto się zapoznać
  • zrobiłem kilka zmian, po których zaczęło wszystko działać ‘ez expekted’ – podstawową było wyeliminowanie jednego ze switchy. czy była to kwestia jakiś problemów na styku HP/Cisco , czy problem MPIO – tego nie wiem, a testować już nie będę. tak jest docelowo i nie ma co komplikować.
  • drugą zmianą która mogła [choć nie powinna] mieć wpływ to włączenie obsługi jumboframes na obu węzłach

wygląda na to, że fundamenty stoją. kilka nuketestów i redukujemy fizyczne klocki (:

eN.

Sprzętowe wsparcia dla wirtualizacji [Hyper-V]

By Mateusz Nadobnik on Czerwiec 27th, 2012

Informatyzacja po polsku – czyli dlaczego jest jak jest?

By Grzesiek Bartosik on Czerwiec 26th, 2012

Czy zastanawialiście się kiedyś dlaczego w Polsce nie ma centralnego systemu do obsługi np. systemu opieki zdrowotnej, (działąjącego) rejestru pojazdów i kierowców (CEPIK) albo innych systemów w administracji publicznej (znanej pod nazwą ePUAP – elektroniczna Platforma Usług Administracji Publicznej), które mogłyby tylko ułatwić życie normalnym obywatelom? Pierwsza myśl jest taka, że to pewnie bardzo skomplikowane i wymaga czasu, aby przeanalizować całość procesu biznesowego, wyprodukować, zintegrować z innymi systemami, a na końcu wdrożyć.

Continue Reading

Nadchodzi nowy Social SharePoint?

By Szymon Bochniak on Czerwiec 26th, 2012

W dniu wczorajszym przez media przewinęła się informacja o zakupieniu przez Microsoft firmy Yammer, której hasłem jest The Enterprise Social network. Firma ta nie jest szerzej znana polskim użytkownikom, jednak na zachodzie oferowany system do budowania platform społecznościowych w przedsiębiorstwach zyskał już ponad 5 mln użytkowników. W sieci pojawiło się wiele artykułów analizujących tą transakcję nie mniej w większości z nich brakowało informacji o przesłankach jakie skłoniły firmę z Redmond do takiej inwestycji. W dniu dzisiejszym piszę o tym na blogu poświęconym technologii SharePoint, gdyż wciągnięcie do swoich szeregów firmy Yammer przez Microsoft może mieć spore znaczenie dla kolejnych edycji SharePointa.

(…)
Czytaj całośćNadchodzi nowy Social SharePoint? (147 words)


© admin for SharePoint Blog, 2012. |
Permalink |
Nikt jeszcze nie skomentował tego wpisu |
Add to
del.icio.us

Post tags: , , ,

SharePoint Online: dziedziczenie uprawnień

By Szymon Bochniak on Czerwiec 26th, 2012

Prezentujemy nowe filmy opisujące zarządzanie uprawnieniami w SHarePoint Online. Nowy odcinek omawia tematykę dziedziczenia uprawnień.

Continue Reading

31. spotkanie PLSSUG Lublin

By Grzesiek Bartosik on Czerwiec 26th, 2012

19 czerwca w siedzibie firmy Asseco Businness Solutions S.A. odbyło się 31.

Continue Reading