.Net рдФрд░ git-рд╣реБрдХ рдХреЗ рд╕рд╛рде Sql рдХреЛрдб рдХреЛ рдорд╛рдиреНрдп рдХрд░реЗрдВ

рд╣реЗрд▓реЛ рд╣рдмреНрд░!

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд╣рдорд╛рд░реА рдХрдВрдкрдиреА рдиреЗ рдЕрдЧрд▓реЗ рд╣реИрдХрдереЙрди рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреАред рдФрд░ рдЗрд╕рдХреА рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рднреАрддрд░, рдореИрдВ рдПрдХ рдЙрдкрдпреЛрдЧреА рдЪреАрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдорд╛рд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЕрдкрдиреЗ рд▓рд┐рдП рдФрд░ рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдПред рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдПрдХ рддрд░рд╣ рдХреЗ рд╡рд░реНрдЧ рдХреЛрдб рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдкрд░ рдЧрд┐рд░ рдЧрдпрд╛ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдирд┐рдпрдореЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдЧрд╛ рдХрд┐ рд╕рдВрдХрд▓рдХ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡реЗ рд▓реЛрдЧ рдЬреЛ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ рд╡реЗ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдРрд╕реЗ рдХрдИ рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ "рдХреНрд╡реЗрд░реА рдХреЗ рдЕрдВрдд рдореЗрдВ GO рдЬреЛрдбрд╝реЗрдВ" рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ "рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдмрдЬрд╛рдп рджреГрд╢реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ" рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдЗрд╕ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд╣реАрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рддреНред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рддреЛ рдЗрд╕реЗ рдбреЗрд╡рд▓рдкрд░ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдЗрдпреЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЕрдкрдиреЗ рдЖрдк рд╣реА рдорд╛рдиреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдРрд╕рд╛ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рд╣реБрдЖ рд╣реИ рдХрд┐ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рднреА sql рдХреЛрдб (рдпрд╛рдиреА, рдЗрд╕реЗ рдореБрдЦреНрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛) рд╣рдорд╛рд░реЗ GIT рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рдЬрд╣рд╛рдВ рдпрд╣ рд╕реАрдзреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ (рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рдмрд╛рдж рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ)ред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ git-рд╣реБрдХ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛, рдЬреЛ sql рдХреЛрдб рдХреЛ рдорд╛рдиреНрдп рдХрд░реЗрдЧрд╛ рдФрд░ рдпрджрд┐ рдпрд╣ рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдкреБрдирд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдкрд╛рд╕ рдХрдорд┐рдЯ рд▓реМрдЯрд╛ рджреА рдЬрд╛рдПрдЧреАред рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛, рдЖрд╕рд╛рди рдмрдирд╛рдирд╛:




рдЧрд┐рдЯ рд╣реБрдХ


рдЗрд╕рд▓рд┐рдП, рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд┐рдЯ-рд╣реБрдХ рдХреА рдУрд░ рдЦреБрджрд╛рдИ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХрдорд┐рдЯ рдХреЛ рдХреИрд╕реЗ рд░рджреНрдж рдХрд┐рдпрд╛ рдЬрд╛рдП (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ)ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЧрд┐рдЯ-рд╣реБрдХ рдХреНрдпрд╛ рд╣реИ: рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдмреИрд╢-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдЬрд┐рд╕реЗ рддрдм рднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рдирд┐рд╢реНрдЪрд┐рдд рдШрдЯрдирд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрддреА рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреА рд╣реЛрддреА рд╣реИрдВ: рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ред рд╣рд╛рдВ, рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреИрд╕реА рдХрдИ рдШрдЯрдирд╛рдПрдВ рд╣реИрдВред рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред
рд╣рдорд╛рд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЧрд┐рдЯ-рд╣реБрдХ "рдЕрдкрдбреЗрдЯ" (рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ) рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИред рдпрд╣ рд╕рд░реНрд╡рд░ рдкрд░ рд╢рд╛рдЦрд╛ рдХреЗ рд░рд╛рдЬреНрдп рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬреЗ рдЧрдП рдЖрдкрдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗред рдФрд░, рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдЕрдЧрд░ рдРрд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдирд┐рдХрд╛рд╕ рдХреЛрдб рдЧреИрд░-рд╢реВрдиреНрдп рд╣реИ, рддреЛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рддреАрди рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ:


рдРрд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрдиреЗ рд╕реЗ, рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдЖрдк рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдорд╛рд░реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рджреВрд╕рд░реЗ рдФрд░ рддреАрд╕рд░реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрджрд▓рд╛ рдЧрдпрд╛ рд╣реИ:

git diff --name-only --diff-filter=[AMCR] $2 $3 

рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЧрд┐рдЯ-рд╢реЛ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рд╕рд╛рдордЧреНрд░реА рд╕реНрд╡рдпрдВ рд╣реЛрдиреЗ рдкрд░, рдЖрдк рдЗрд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧрд┐рдЯ-рд╣реБрдХ рдЕрджреНрдпрддрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рд╕реВрдЪреА рд╣реИ, рд╕рд╛рде рд╣реА рджреЛ рд╕рд╣рд╛рдпрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рднреА рд╣реИрдВ:

 #!/bin/sh ex=0 okResult="OK" originalPath='/git/test.git/' #   git printf "---- 'Sql checker' hook ----" listOfFiles=$(git diff --name-only --diff-filter=[AMCR] $2 $3) #   for changedFile in $listOfFiles do printf "checking:$changedFile" fullFilePath="$3:$changedFile" git-show $fullFilePath >tmp_sql result=$($originalPath/hooks/check-sql tmp_sql) #  if [ "$result" != $okResult ] then res=${result//|/\\n } printf " $res\n" #  ex=1 else printf "ok!\n" fi done printf "---- Done ----" exit $ex 

рдЪреЗрдХ-рдПрд╕рдХреНрдпреВрдПрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрд╛рд╣рд░реА рд╕рдВрд╕рд╛рдзрди рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЛрдб рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛ рд╕рдХреЗ, рдФрд░ рд╕рд╛рдмреБрди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдкрд░рд┐рдгрд╛рдо рдХреЛ рднреА рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ:

 #!/bin/sh soap-template $1 tmp_soap wget -qO- --post-file=tmp_soap --header="Content-type: text/xml; charset=utf-8" 127.0.0.1/check-sql.asmx | gawk -v re="<CheckFileResult.*>(.*)/CheckFileResult>" '{match($0,re,RMATCH); print RMATCH[1]}' 

рдФрд░ рд╕рд╛рдмреБрди-рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдмрд╛рдж, рдЬреЛ рдПрд╕рдХреНрдпреВрдПрд▓-рдХреЛрдб рдПрдХ рд╕рд╛рдмреБрди рдЕрдиреБрд░реЛрдз рдмрдирд╛рддрд╛ рд╣реИ:

 #!/bin/sh encodedFile=$(base64 $1) echo '<?xml version="1.0" encoding="utf-8"?>' >$2 echo '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSc ma" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">' >> $2 echo ' <soap:Body>' >>$2 echo ' <CheckFile xmlns="http://tempuri.org/">' >>$2 echo " <base64>$encodedFile</base64>" >>$2 echo ' </CheckFile>' >>$2 echo ' </soap:Body>' >>$2 echo '</soap:Envelope>' >>$2 

рдЗрд╕рд▓рд┐рдП, рдореИрдВ bash рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЗрддрдирд╛ рдордЬрдмреВрдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдЙрди рдкрд░ рдПрдХ sql рдХреЛрдб рдЪреЗрдХ рдХрд░реВрдВ; рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ .Net рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

.Net рд╣рд┐рд╕реНрд╕рд╛


Git-hook рдФрд░ .Net рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдкреБрд▓ рдХреЗ рд╕рд╛рде, рдореИрдВрдиреЗ .net рд╡реЗрдм рд╕реЗрд╡рд╛ рдХреЛ рдЪреБрдирд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣рдорд╛рд░реА git-рд╣реБрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ "рдЪреЗрдХ-рдПрд╕рдХреНрдпреВрдПрд▓" рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдЬреЛ рдЗрд╕ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ sql рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рд╢рд╛рдорд┐рд▓ рд╣реИред

 [WebMethod] public string CheckFile(string base64) { var errors = new List<SqlCheckError>(); string result = OkResult; try { //  sql- string sqlScript = Encoding.Default.GetString(Convert.FromBase64String(base64)); //    ISqlCheck var containerProvider = new SqlCheckUnityProvider(); //    var checker = new SqlCheckProcess(containerProvider); errors.AddRange(checker.CheckSql(sqlScript)); } catch (Exception e) { Log(e); // return OkResult; //      ,       . } //  ( )     git-hook if (errors.Count > 0) { result = string.Join("|", errors.Select(error => string.Format("{1}: {0}", error.Message, error.Type))); } return result; } 

рдкрд╣рд▓реЗ рд╕реЗ рд╣реА .net рдкрд░реНрдпрд╛рд╡рд░рдг рд╣реЛрдиреЗ рдФрд░ рд╣рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП sql-code рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдврд╛рдВрдЪрд╛ рдмрдирд╛рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╕рднреА рдХреЛрдб рдХреЛ рдпрд╣рд╛рдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдирд╛ рдмрд╣реБрдд рдЙрдЪрд┐рдд рдирд╣реАрдВ рд╣реИред рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдореИрдВ рдЗрд╕реЗ рдЧреАрдереВрдм рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд░рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ:

 public interface ISqlCheck { bool CheckSql(string sqlCode); SqlCheckError GetError(string sqlCode); } 

рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдХ рд╕рддреНрдпрд╛рдкрди рдирд┐рдпрдо рд╣реИред рдПрдХрддрд╛ рдХрдВрдЯреЗрдирд░ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж , рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд┐рдпрдореЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рде рд╣реА, рдПрдХ sql parser ( TSql100Parser ) рдХреЛ .net рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдирд┐рдпрдо рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрднреНрдпрд╛рд╕


рдпрд╣ рд╕рд░рд▓ рдкреНрд░рдгрд╛рд▓реА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реА рдХрдВрдкрдиреА рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рдЪреБрдХреА рд╣реИ, рдХреБрдЫ рднрд╛рд░реА рд▓рд╛рднреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рдирд╛ рдмрд╣реБрдд рдЬрд▓реНрджрдмрд╛рдЬреА рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдмрдбрд╝рд╛ рдорд╛рд░реНрдЬрд┐рди рд╣реЛрдиреЗ рдкрд░, рд╣рдо рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рд╕реЗ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд╛рдн рдиреБрдХрд╕рд╛рди рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╣реЛрдВрдЧреЗред
рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЗрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдХрдВрд╕реЛрд▓ рд▓реЙрдЧ рд▓рд╛рддрд╛ рд╣реВрдВ:

 $ git push origin master Counting objects: 7, done. Delta compression using up to 8 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (4/4), 347 bytes, done. Total 4 (delta 2), reused 0 (delta 0) remote: remote: ---- 'Sql checker' hook ---- remote: remote: checking: test/create_sp.sql remote: Error: Missed 'GO' statement after stored procedure. remote: remote: ---- Done ---- remote: remote: error: hook declined to update refs/heads/master To ssh://user@git.local/git/test.git ! [remote rejected] master -> master (hook declined) error: failed to push some refs to 'ssh://user@git.local/git/test.git' 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк penultimate рд▓рд╛рдЗрди рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд sql рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдВ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╕рднреА рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ!

Source: https://habr.com/ru/post/In205888/


All Articles