reede, 29. mai 2009

SQL SERVER UDF funktsiooni teksti sisust parameetri vaikeväärtuse teadasaamine

Kui süsteemis on kasutusel meetod, kus mingi asja käitumine sõltub näiteks UDF funkstiooni parameetri väärtusest ja nüüd vaja teada
saada, kuidasmoodi see parameeter on seatud saab kasutada sellist

Funktsiooni päis ise, mille parameetrit teada tahame

ALTER FUNCTION [dbo].[VIITENUMBER]( @lepingu_nr INT, @arvenumber BIGINT, @meetod TINYINT=0 )
RETURNS NVARCHAR(30)
AS
...

ja siin @meetod TINYINT=0 vaikeväärtus määrab ära, kuidas süsteem peab käituma
siis selle väärtuse teadasaamiseks võib kasutada lähenemist, kus otsime funktsioon teksti sisust

DECLARE @t VARCHAR(8000), @Re INT
--leiame funktsiooni VIITENUMBER
SET @Re = ( SELECT TOP 1 ID FROM sys.sysobjects WHERE name = 'VIITENUMBER' AND XTYPE ='FN' )
--leiame tema sisu kirjelduse alguse
SET @t = ( SELECT LEFT(TEXT,8000) FROM sys.syscomments WHERE ID = @Re )
--otsime tema teksti kirjeldusest viitenumbri meetodi parameetri kohta
SET @Re=CHARINDEX('@meetod TINYINT=',@t)
--võtame antud kohast 3 tükki ja kuna on funktsiooni viimane parameeter siis lõpust ) eemaldame
SET @t = (SELECT REPLACE(SUBSTRING(@t,@Re+16,3),')','') )

ja @t väärtus peaks olema antud juhul '0', mida otsisimegi

neljapäev, 21. mai 2009

SQL SERVER-i tabeli struktuuri kirjeldus koos väljade kirjeldusega

Kui sul on SQL SERVER-i tabel ja tabeli väljadele on lisatud kirjeldused siis see päring teeb välja nimi / kirjeldus väljavõtte

DECLARE @tabel NVARCHAR(128)
SET @tabel= 'TABELINIMI'

SELECT sc.column_name, CAST(extended_properties.value AS NVARCHAR(1000)) AS [description]
FROM (
SELECT isc.column_name , c.[object_id], c.column_id
FROM information_schema.columns isc
INNER JOIN sys.columns c ON isc.column_name = c.name
AND OBJECT_NAME(c.object_id) = @tabel
AND isc.table_name = @tabel
AND OBJECTPROPERTY(c.object_id, 'IsMsShipped')=0
) sc
LEFT JOIN sys.extended_properties ON (sc.[object_id] = extended_properties.major_id AND sc.[column_id] = extended_properties.minor_id)
ORDER BY sc.column_name
Blogged with the Flock Browser

kolmapäev, 20. mai 2009

SQL SERVER-ile ligipääsu piiramine IP aadressi põhiselt EVENTDATA() XML andmeid kasutades

Kui on ASP.NET veebirakendus istub serveril koos teiste SQL SERVER baasi kasutavate rakendustega ja SQL SERVER-i port on väljast lahti kuid enda rakendusel pöördumine andmebaasi käib ainult läbi veebirakenduse võib kasutada SQL SERVER-i LOGON trigerit, et piirata mujalt rakenduse andmebaasile ligipääsu. DDL LOGON trigeris uurib, kust ühenduti ja seejärel otsustab. Mõjub ainult nendele SQL LOGIN-ite mille vaikimisi andmebaas langeb kokku trigeris määratuga.
Nõuab SQL SERVER 2005 SP2 vähemalt. RAISERROR veateated lähevad ainult Serveri Application Event logisse. Kui IP aadress ei sobi saab sellise veateate:
Logon failed for login 'USERNAME' due to trigger execution


ALTER TRIGGER [KONTROLL_LOGON_CheckIP]
ON ALL SERVER
WITH EXECUTE AS 'sa' --kasutaja peab olema sysadmin fixed server role või ALTER TRACE õigusega kuna RAISERROR WITH LOG kasutame
FOR LOGON
AS
BEGIN
DECLARE @ev XML, @usr NVARCHAR(50), @ip NVARCHAR(35), @lubat INT, @defdb NVARCHAR(128)
SET @defdb='ABAASINIMI' --andmebaasi nimi, kus meil rakendus serveril sees on
SET @ev=(SELECT EVENTDATA())
SELECT @ip = @ev.value('(/EVENT_INSTANCE/ClientHost)[1]', 'NVARCHAR(35)') --kliendi IP aadress
,@usr=@ev.value('(/EVENT_INSTANCE/LoginName)[1]', 'NVARCHAR(50)') --kasutajanimi

IF @ip IS NULL --kui ühendutakse mingi muu protokolliga
RETURN



-- --uurime et on tegu SQL Loginiga ja on tegu LOGON tüüpi sündmusega
IF (SELECT @ev.value('(/EVENT_INSTANCE/LoginType)[1]', 'NVARCHAR(15)')) = 'SQL Login' --piirame ainult SQL Loginite ligipääsu
AND (SELECT @ev.value('(/EVENT_INSTANCE/EventType)[1]', 'NVARCHAR(15)')) = 'LOGON'
BEGIN
--kontrollime, kas on üldse ligipääs lubatud määratud andmebaasi, loginil peab olema @defdb baas määratud vaikimisi andmebaasiks
SET @lubat = (SELECT is_disabled FROM sys.sql_logins WITH (NOLOCK) WHERE name=@usr AND default_database_name=@defdb)
IF @lubat = 0 --kui antud SQL SERVER loginil on vaikimisi andmebaasile ligipääs lubatud
BEGIN
IF @ip NOT IN ('10.0.40.8') --Siia sulgudesse need IP aadressid, kust on lubatud ligipääs andmebaasile
BEGIN
RAISERROR('Ligipääs andmebaasile %s IP aadressilt %s on kasutajale %s keelatud',10,1,@defdb,@ip,@usr) WITH LOG --ka infona ka serveri Event Aplication Logi
ROLLBACK
--kui vaja kuskilegi kirja panna, et ligi ei saadud
--INSERT INTO [test].[dbo].[LOGI] (IPA, [EVENT]) VALUES (@ip,@ev)
RETURN

END
END
ELSE --kasutajal puudub vaikimisi juurdepääs määratud andmebaasile, mingi muu kasutaja
BEGIN
RAISERROR('Ligipääs vaikimisi andemebaasile %s IP addressilt %s on kasutajale %s keelatud',10,1,@defdb,@ip,@usr) WITH LOG --ka infona ka serveri Event Aplication Logi
ROLLBACK
RETURN
END
END

END

Triger ei rakendu, kui ühendutakse Dedicated Administrator Connection-i kaudu


Päring teada saamaks, kes ja kuidas sul SQL SERVER-i küljes on

SELECT s.session_id
, c.connect_time
, s.login_time
, s.login_name, s.original_login_name
, c.protocol_type
, c.client_net_address
, c.client_tcp_port
, c.auth_scheme
, s.HOST_NAME
, s.program_name, s.client_interface_name
FROM sys.dm_exec_sessions s
JOIN sys.dm_exec_connections c
ON s.session_id = c.session_id

Blogged with the Flock Browser

kolmapäev, 13. mai 2009

IIS6 ReturnUrl, automaatne edasisuunamine tuvastamiseks

Veebirakendusel on mitu sisselogimislehekülge näiteks

loginTen.aspx
loginEmp.aspx

ja tahad nagu saada logida saidile veebilehelt XXXXX\loginTen.aspx
aga brauser pöörab URL-i hoopis XXXX\loginEmp.aspx?ReturnUrl=%2floginTen.aspx

See juhtub siis, kui rakenduse Web.Config seadistada nii, et kõik audentimata kasutajad on keelatud, sel juhul IIS suuneb edasi"forms loginUrl" toodud lehe peale

<authentication mode="Forms">
<forms loginUrl="~/loginEmp.aspx" timeout="60" />
</authentication>
<authorization>
<deny users="?" />
</authorization>

asi läheb tagasi korda kui lubada rakendust joosta kõikide kontode all
<authorization>
<allow users="*"/>
<deny users="?" />
</authorization>
Blogged with the Flock Browser

reede, 8. mai 2009

XML muutuja tagastamine MS SQL SERVER-i salvestatud protseduurist

Isegi siin on omapärad, on salvestatud protseduur, kust tagastatakse ka XML tüüpi muutuja

Salvestatud protseduur ise

ALTER PROCEDURE [dbo].[HOUSE_DEP_KUIDO_U]
@teenuse_id NCHAR(5),
@genarved XML=NULL OUTPUT --seda tahame kätte saada

--siin annab @genarved muutujale väärtuse
DECLARE @arved TABLE (account_id BIGINT PRIMARY KEY)
INSERT INTO @arved (account_id) VALUES(13)
INSERT INTO @arved (account_id) VALUES(12)
SET @genarved = ( SELECT account_id AS 'Invoice/@InvoiceId' FROM @arved FOR XML PATH(''), TYPE, ROOT('Invoices') )

tulemus on SQL-is XML-ina on

<Invoices>
<Invoice InvoiceId="12" />
<Invoice InvoiceId="13" />
</Invoices>

Antud asja ADO.NET-is kasutamine

using System.Data.SqlClient;
using System.Xml;
using System.Data;

using (SqlConnection konn = new SqlConnection(Configuration.ConnectionString))
{
SqlCommand komm = new SqlCommand("[dbo].[HOUSE_DEP_KUIDO_U]", konn);
komm.CommandType = CommandType.StoredProcedure;
// siin tuleb SqlDbType.Xml tüübi suuruseks panna positiivne arv ja määrab ka et on tagastatav parameeter
komm.Parameters.Add("@genarved", SqlDbType.Xml,8).Direction = ParameterDirection.InputOutput;
konn.Open();
komm.ExecuteNonQuery();
}
//XML muutuja lugemine ADO.NET XmlDocument objekti

XmlDocument kort = new XmlDocument();
kort.LoadXml(komm.Parameters["@genarved"].Value.ToString().Trim());

Blogged with the Flock Browser

Javascripti alert aken UpdatePaneli sees

Kui peale mingit toimingut vaja näidata ekraanil JavaScripti kinnitusakent aga lehel kasutame UpdatePanel-it siis selle UpdatePaneli sees
JavaScript alert käib niimoodi

String scriptString ="";
string alertText = "Reaalsus on kestev illusioon";
// siin script language=""javascript"" on oluline
scriptString = @"<script language=""javascript""> alert('" + alertText + "');</script>";
if (!this.Page.ClientScript.IsClientScriptBlockRegistered("clientScript"))
{
//kuna oleme updatepaneli sees, tuleb seda ScriptManager.RegisterStartupScript meetodit kasutada
ScriptManager.RegisterStartupScript(this,this.GetType(), "clientScript", scriptString, false);
}
Blogged with the Flock Browser

kolmapäev, 6. mai 2009

IE8-ga VisualStudio2008-s debugimisel "kaovad" sessioonimuutujad httpCookies requireSSL="true" puhul

kui web.config failis see rida juures
<httpCookies requireSSL="true" />

siis VisualStudio2008 ja IE8-ga debugides hakkavad sessioonimuutujad "kaduma". Lähevad erinevasse lõime või toimub pöördumine asünkroonselt. Ilmeb siis, kui veebileht pöördub mingis teises DLL-s oleva meetodi poole, mis neid sessioonimuutujaid näpib.
Debugimise ajaks kommenteeri web.configist antud rida välja

Blogged with the Flock Browser