Vaja keelata, et üks andmebaasi roll ei saa muuta tabeli ühte välja
Süntaks siis selline:
DENY UPDATE(COMMENT) ON OBJECT::DBO.APPLICATION TO TENANT
Keelab andmete muutmise (UPDATE) tabeli APPLICATION väljal COMMENT andmebaasi rollile TENANT
reede, 26. august 2011
teisipäev, 7. juuni 2011
Trigeri pinu
Mõnikord vaja teada, mis protseduur või SQL lausend põhjustab trigeri käivitamise
Trigeri pinu(trigger call-stack) teadasaamiseks saab kasutada DBCC INPUTBUFFER funktsiooni.
DML trigeri koodinäide
-- Püüame objekti ID kinni, kust trigeri väljakutse tehti DBCC INPUTBUFFER funktsiooni jaoks
DECLARE @temp2 NVARCHAR(4000), @temp NVARCHAR(MAX), @reqid INT
SET @reqid = ( SELECT request_id FROM sys.dm_exec_requests WITH(NOLOCK) WHERE session_id = @@SPID)
IF ISNULL(@reqid,0) = 0
SET @reqid = ( SELECT session_id FROM sys.dm_exec_requests WITH(NOLOCK) WHERE session_id = @@SPID)
--salvestame DBCC INPUTBUFFER funktsiooni väljakutsuva call stacki tabelmuutujasse
DECLARE @calls TABLE (EventType NVARCHAR(30) COLLATE DATABASE_DEFAULT NULL, Parameters SMALLINT NULL, EventInfo NVARCHAR(4000) COLLATE DATABASE_DEFAULT NULL)
DECLARE @sl NVARCHAR(4000)
SET @sl='DBCC INPUTBUFFER('+CAST(@reqid AS NVARCHAR(20))+') WITH NO_INFOMSGS'
--käivitab trigeris DBCC INPUTBUFFER funktsiooni
INSERT INTO @calls EXEC(@sl)
-- Teeme nüüd pinust väljavõtte
SET @temp2 = NULL
SELECT @temp2 = COALESCE(@temp2+',','') + EventType+' '+EventInfo FROM @calls
@temp2 muutujas on trigeri pinu olemas
Trigeri pinu(trigger call-stack) teadasaamiseks saab kasutada DBCC INPUTBUFFER funktsiooni.
DML trigeri koodinäide
-- Püüame objekti ID kinni, kust trigeri väljakutse tehti DBCC INPUTBUFFER funktsiooni jaoks
DECLARE @temp2 NVARCHAR(4000), @temp NVARCHAR(MAX), @reqid INT
SET @reqid = ( SELECT request_id FROM sys.dm_exec_requests WITH(NOLOCK) WHERE session_id = @@SPID)
IF ISNULL(@reqid,0) = 0
SET @reqid = ( SELECT session_id FROM sys.dm_exec_requests WITH(NOLOCK) WHERE session_id = @@SPID)
--salvestame DBCC INPUTBUFFER funktsiooni väljakutsuva call stacki tabelmuutujasse
DECLARE @calls TABLE (EventType NVARCHAR(30) COLLATE DATABASE_DEFAULT NULL, Parameters SMALLINT NULL, EventInfo NVARCHAR(4000) COLLATE DATABASE_DEFAULT NULL)
DECLARE @sl NVARCHAR(4000)
SET @sl='DBCC INPUTBUFFER('+CAST(@reqid AS NVARCHAR(20))+') WITH NO_INFOMSGS'
--käivitab trigeris DBCC INPUTBUFFER funktsiooni
INSERT INTO @calls EXEC(@sl)
-- Teeme nüüd pinust väljavõtte
SET @temp2 = NULL
SELECT @temp2 = COALESCE(@temp2+',','') + EventType+' '+EventInfo FROM @calls
@temp2 muutujas on trigeri pinu olemas
pühapäev, 20. märts 2011
Dataseti sisseandmine ReportViewer 2010 aruandele
ReportViewer 2010-ga loodud aruandele on Datasettide sisseandmine programmi koodis tehtud lihtsamaks. Aruande dataseti dünaamiliseks etteandmiseks piisab tema nime teadmisest

C# koodis aruandele koodi külgepanek käib nii
//Kuna on ReportViewer2010 aruanne siis datasource külge panemine käib läbi DatSeti nime "DataSetApplications"
this.ReportViewerAsendus.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("DataSetApplications", (System.Data.DataTable)tb));

C# koodis aruandele koodi külgepanek käib nii
//Kuna on ReportViewer2010 aruanne siis datasource külge panemine käib läbi DatSeti nime "DataSetApplications"
this.ReportViewerAsendus.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("DataSetApplications", (System.Data.DataTable)tb));
esmaspäev, 7. veebruar 2011
Teksti jagamine stringimassiiviks
muutujas htext on reavahetustega tekst
esimene rida
teine rida
kolmas rida
Masiivi saab temast teha, hea lihtne kirjutada
string[] slehed = htext.Split(new string[] { "\r\n", "|" }, StringSplitOptions.RemoveEmptyEntries);
"\r\n", "|" on realõpu tunnused, ehk massiiviks tehakse ka string
esimene rida|teine rida|kolmas rida
esimene rida
teine rida
kolmas rida
Masiivi saab temast teha, hea lihtne kirjutada
string[] slehed = htext.Split(new string[] { "\r\n", "|" }, StringSplitOptions.RemoveEmptyEntries);
"\r\n", "|" on realõpu tunnused, ehk massiiviks tehakse ka string
esimene rida|teine rida|kolmas rida
teisipäev, 21. detsember 2010
https päring SQL serveri CLR protseduurist
Igasugu asju võimaldatakse ka andmebaasis teha CLR-iga aga kui vaja teha sertifikaadikindel https postitus võib seda teha nii.
Et serveri sertifikaatide veateadetest lahti saada tuleb kasutada
ServicePointManager.ServerCertificateValidationCallback meetodi ülekirjutamist
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using System.Net;
using System.IO;
private static bool ValidateRemoteCertificate( object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors )
{
//siia võib mingi mõistliku veatöötluse juurde arendada, praegu annab alati true, ehk kõikidest vigadest läheb mööda.
return true;
}
CLR protseduur ise
[Microsoft.SqlServer.Server.SqlProcedure]
public static void VeebiParing(SqlString url, SqlString andmed, SqlString kellelt, out SqlString outt)
{
try
{
//see on sertifikaadi veast möödahiilimiseks
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);
HttpWebRequest myRequest=(HttpWebRequest)System.Net.WebRequest.Create((string)url);
myRequest.Method = "POST";
myRequest.ContentType = "application/x-www-form-urlencoded";
//paneme sisu kokku
StringBuilder postData = new StringBuilder();
//siin paneb andmed külge
postData.Append("Saadame="+(string)kellelt+"&andmeid="+(string)andmed);
//päringu andmete sisu tuleb läbi System.Uri.EscapeUriString lasta, muidu ei lähe läbi veebi.
string data = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(System.Uri.EscapeUriString(postData.ToString()));
myRequest.ContentLength = data.Length;
// Striim veebi saatmiseks
Stream newStream = myRequest.GetRequestStream();
// Saadame minema
newStream.Write(data, 0, data.Length);
newStream.Close();
//loeme vastuse
HttpWebResponse loWebResponse = (HttpWebResponse)myRequest.GetResponse();
Encoding enc = System.Text.Encoding.GetEncoding("UTF-8");
StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc);
//kuna on protseduur siis nii saab sisulistvastust tagastada
outt = loResponseStream.ReadToEnd();
loResponseStream.Close();
loWebResponse.Close();
}
catch ( WebException ex)
{
outt = "WebException: " + ex.Message;
}
catch (SystemException ex)
{
outt="Error: "+ex.Message;
}
return;
}
Kui andmebaas hakkab CLR alusel protseduuri looma siis NVARCHAR(4000) sisendparameetri võid muuta NVARCHAR(MAX) peale ja ASSEMBLY tuleb teha UNSAFE märgendiga, mis annab CLR protseduurile turvalisuse seisukohalt laiad võimalused ehk kaaluda tasub muude võimaluste kasutamist
Et serveri sertifikaatide veateadetest lahti saada tuleb kasutada
ServicePointManager.ServerCertificateValidationCallback meetodi ülekirjutamist
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using System.Net;
using System.IO;
private static bool ValidateRemoteCertificate( object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors )
{
//siia võib mingi mõistliku veatöötluse juurde arendada, praegu annab alati true, ehk kõikidest vigadest läheb mööda.
return true;
}
CLR protseduur ise
[Microsoft.SqlServer.Server.SqlProcedure]
public static void VeebiParing(SqlString url, SqlString andmed, SqlString kellelt, out SqlString outt)
{
try
{
//see on sertifikaadi veast möödahiilimiseks
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);
HttpWebRequest myRequest=(HttpWebRequest)System.Net.WebRequest.Create((string)url);
myRequest.Method = "POST";
myRequest.ContentType = "application/x-www-form-urlencoded";
//paneme sisu kokku
StringBuilder postData = new StringBuilder();
//siin paneb andmed külge
postData.Append("Saadame="+(string)kellelt+"&andmeid="+(string)andmed);
//päringu andmete sisu tuleb läbi System.Uri.EscapeUriString lasta, muidu ei lähe läbi veebi.
string data = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(System.Uri.EscapeUriString(postData.ToString()));
myRequest.ContentLength = data.Length;
// Striim veebi saatmiseks
Stream newStream = myRequest.GetRequestStream();
// Saadame minema
newStream.Write(data, 0, data.Length);
newStream.Close();
//loeme vastuse
HttpWebResponse loWebResponse = (HttpWebResponse)myRequest.GetResponse();
Encoding enc = System.Text.Encoding.GetEncoding("UTF-8");
StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc);
//kuna on protseduur siis nii saab sisulistvastust tagastada
outt = loResponseStream.ReadToEnd();
loResponseStream.Close();
loWebResponse.Close();
}
catch ( WebException ex)
{
outt = "WebException: " + ex.Message;
}
catch (SystemException ex)
{
outt="Error: "+ex.Message;
}
return;
}
Kui andmebaas hakkab CLR alusel protseduuri looma siis NVARCHAR(4000) sisendparameetri võid muuta NVARCHAR(MAX) peale ja ASSEMBLY tuleb teha UNSAFE märgendiga, mis annab CLR protseduurile turvalisuse seisukohalt laiad võimalused ehk kaaluda tasub muude võimaluste kasutamist
reede, 29. oktoober 2010
AjaxToolkit NotBot extender näitab osadele BruteForce tööriistadele trääsa
Alates ASP.NET 3.5 versioonist ka Ajax NotBot extender olemas. Kasutada saab näiteks BruteForce tööriistade vastu, mis salasõnade äraarvamisega süsteemi sisse pääseda püüavad.
Päringute arve piiramine(RequestRateLimiting) aitab ka siin nagu tavaliselt alati.
Peale extenderi vormile lohistamist saab mängida peamiselt kolme parameetriga
ResponseMinimumDelaySeconds="3" tähendab seda, et peale veebivormi avanemist(allalaadimist) peab ootama 3 sekundit ennem kui PostBack serveri poolt töötlemisele võetakse
CutoffMaximumInstances="8" ja CutoffWindowSeconds="50" määravad ära, et "luba 50 sekundi jooksul ainult 8 korda PostBack-i teha". Maakeeli tähendab seda, et 50 sekundi jooksul saab ainult 8 korda salasõna äraarvamist proovida
Code-behindi võib näiteks teha niimoodi (soovitav lisada ka veateate hägustamise osa)
protected void ButtonLogin_Click(object sender, EventArgs e)
{
AjaxControlToolkit.NoBotState nbstate;
if (!this.NoBot1.IsValid(out nbstate))
{
switch (nbstate)
{
case AjaxControlToolkit.NoBotState.InvalidResponseTooSoon: //liiga vara sisestati peale vormi laadimist
{
this.CustomValidatorLoginFailed.ErrorMessage = "Liiga kiiresti alustasite";
break;
}
case AjaxControlToolkit.NoBotState.InvalidAddressTooActive: //liiga kiiresti sisestatakse lubatud ajavahemiku jooksul
{
this.CustomValidatorLoginFailed.ErrorMessage = "Liiga sageli proovite";
break;
}
default:
{
this.CustomValidatorLoginFailed.ErrorMessage = "BotRobot " + nbstate;
break;
}
}
this.CustomValidatorLoginFailed.IsValid = false;
return;
}
//siit saati võib nüüd päringut töötlema asuda
}
Päringute arve piiramine(RequestRateLimiting) aitab ka siin nagu tavaliselt alati.
Peale extenderi vormile lohistamist saab mängida peamiselt kolme parameetriga
ResponseMinimumDelaySeconds="3" tähendab seda, et peale veebivormi avanemist(allalaadimist) peab ootama 3 sekundit ennem kui PostBack serveri poolt töötlemisele võetakse
CutoffMaximumInstances="8" ja CutoffWindowSeconds="50" määravad ära, et "luba 50 sekundi jooksul ainult 8 korda PostBack-i teha". Maakeeli tähendab seda, et 50 sekundi jooksul saab ainult 8 korda salasõna äraarvamist proovida
Code-behindi võib näiteks teha niimoodi (soovitav lisada ka veateate hägustamise osa)
protected void ButtonLogin_Click(object sender, EventArgs e)
{
AjaxControlToolkit.NoBotState nbstate;
if (!this.NoBot1.IsValid(out nbstate))
{
switch (nbstate)
{
case AjaxControlToolkit.NoBotState.InvalidResponseTooSoon: //liiga vara sisestati peale vormi laadimist
{
this.CustomValidatorLoginFailed.ErrorMessage = "Liiga kiiresti alustasite";
break;
}
case AjaxControlToolkit.NoBotState.InvalidAddressTooActive: //liiga kiiresti sisestatakse lubatud ajavahemiku jooksul
{
this.CustomValidatorLoginFailed.ErrorMessage = "Liiga sageli proovite";
break;
}
default:
{
this.CustomValidatorLoginFailed.ErrorMessage = "BotRobot " + nbstate;
break;
}
}
this.CustomValidatorLoginFailed.IsValid = false;
return;
}
//siit saati võib nüüd päringut töötlema asuda
}
reede, 22. oktoober 2010
applicationHost.config faili asukoht 32-bitistel arvutitel
Asub siin
C:\Windows\System32\inetsrv\config
Kui hakkad IIS7 all näiteks web.config faili RequestFiltering sektsiooni
sisse kirjutama ja pistab kisama, a'la
This configuration section cannot be used at this path. This happens when the section is locked at a parent level. Locking is either by default (overrideModeDefault="Deny"), or set explicitly by a location tag with overrideMode="Deny" or the legacy allowOverride="false".
siis põhjus selles, et applicationHost.config failis on
<section name="requestFiltering" overrideModeDefault="Deny">
keelatud web.config failides requestFiltering osa muuta
Lubada saad, kui muuta applicationHost.config failis overrideModeDefault="Allow"
peale seda iisreset ja võtab taas pildi ette
C:\Windows\System32\inetsrv\config
Kui hakkad IIS7 all näiteks web.config faili RequestFiltering sektsiooni
sisse kirjutama ja pistab kisama, a'la
This configuration section cannot be used at this path. This happens when the section is locked at a parent level. Locking is either by default (overrideModeDefault="Deny"), or set explicitly by a location tag with overrideMode="Deny" or the legacy allowOverride="false".
siis põhjus selles, et applicationHost.config failis on
<section name="requestFiltering" overrideModeDefault="Deny">
keelatud web.config failides requestFiltering osa muuta
Lubada saad, kui muuta applicationHost.config failis overrideModeDefault="Allow"
peale seda iisreset ja võtab taas pildi ette
Tellimine:
Postitused (Atom)