FYI рдХрд░реЗрдВ: рдпрд╣ рд▓реЗрдЦ SQA рдбреЗрдЬрд╝ # 25 рдореЗрдВ рдореЗрд░реА рдмрд╛рдд рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИредрд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ: DB рдХреЛрдб рдкрд░реАрдХреНрд╖рдг рдПрдХ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдлреИрд▓рд╛ рдЕрднреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рдЦрддрд░рдирд╛рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред DB рддрд░реНрдХ рдордиреБрд╖реНрдп рджреНрд╡рд╛рд░рд╛ рдЕрдиреНрдп рд╕рднреА "рд╕рд╛рдорд╛рдиреНрдп" рдХреЛрдб рдХреА рддрд░рд╣ рд╣реА рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ, рд╡рд┐рдлрд▓рддрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рдЙрддреНрдкрд╛рдж, рд╡реНрдпрд╡рд╕рд╛рдп рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд░рд┐рдгрд╛рдо рдкреИрджрд╛ рдХрд░ рд╕рдХрддреА рд╣реИрдВред рдХреНрдпрд╛ рдпреЗ рдмреИрдХрдПрдВрдб рдХреА рдорджрдж рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реИрдВ рдпрд╛ рдпрд╣ рдХрд┐рд╕реА рдЧреЛрджрд╛рдо рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдИрдЯреАрдПрд▓ рд╣реИ - рд╣рдореЗрд╢рд╛ рдПрдХ рдЬреЛрдЦрд┐рдо рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдЗрд╕реЗ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ tSQLt рдХреНрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╣рдореЗрдВ DB рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рдХреИрд╕реЗ рдорджрдж рдХрд░рддрд╛ рд╣реИред

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

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

XLS рдлрд╝рд╛рдЗрд▓, рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде 2 рдХреЙрд▓рдо + рдЕрдиреНрдп рдХреЙрд▓рдореЛрдВ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдЦрдВрдбрд┐рдд + рднреНрд░рдорд┐рдд рдорд╛рд░реНрдХрдЕрдкред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЗрдЪреНрдЫрд╛рдУрдВ рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЯреЗрд╕реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдХреЛрдб рдЬрдЯрд┐рд▓рддрд╛ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдЬрдЯрд┐рд▓рддрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдкреНрд░рднрд╛рд╡ рдХреЛ рдЦрддреНрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЯреЗрд╕реНрдЯ рд╕реНрд╡рддрдГрд╕реНрдлреВрд░реНрдд рд╡рд┐рд▓рдп рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд░рдХреНрд╖рд╛ рдкрд░рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╕реАрдЖрдИ рдСрдЯреЛ рдкрд░реАрдХреНрд╖рдг рдЙрдирдХреА рдФрдкрдЪрд╛рд░рд┐рдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╣рдордиреЗ рд╕реНрд╡рдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ?
DB рдХреЛрдб рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ 2 рджреГрд╖реНрдЯрд┐рдХреЛрдг рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ: SQL- рд╕рдВрдЪрд╛рд▓рд┐рдд (рдЬрдм рдПрдХ рдЙрдкрдХрд░рдг рд╕реАрдзреЗ DBMS рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ) рдФрд░ рдЧреИрд░-SQL- рд╕рдВрдЪрд╛рд▓рд┐рддред рдпрд╣рд╛рдБ рдореБрдЦреНрдп рдЕрдВрддрд░ рдореБрдЭреЗ рдорд┐рд▓реЗ:
SQL рд╕рд░реНрд╡рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:
рд╕реНрдХреЗрд▓ "рдЙрддреНрдХреГрд╖реНрдЯ - рдлреЗрд▓рд┐рдВрдЧ" рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╣реИ, рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред
"рдкрд╣рд▓реА рдЙрдкрд╕реНрдерд┐рддрд┐" - рдлреНрд░реЗрдорд╡рд░реНрдХ рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рд╕рдмрд╕реЗ рд╢реБрд░реБрдЖрддреА рддрд╛рд░реАрдЦ рдЬреЛ рдореБрдЭреЗ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ - рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рд░рд┐рд▓реАрдЬ рдпрд╛ рдкреНрд░рддрд┐рдмрджреНрдзред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, SQL- рд╕рдВрдЪрд╛рд▓рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдХрд╛рдлреА рд╕рдордп рдкрд╣рд▓реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ tSQLt рдХреЗрд╡рд▓ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдЙрддреНрдкрд╛рдж рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, tSQLt рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЬреАрддрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЪреАрдЬрд╝ рд╣реИ, TST tSQLt рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рдЕрдзрд┐рдХ рд╕рдореГрджреНрдз рд╣реИ; рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕рднреА рд╡рд┐рдкрдХреНрд╖реЛрдВ рдХреЛ рдкрдЫрд╛рдбрд╝ рд╕рдХрддрд╛ рд╣реИред
TSQLt рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпрд╛рдБ рд╣реИрдВ, рдореИрдВ рдмрд╛рдж рдореЗрдВ рдЙрдирдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдБрдЧрд╛ред
рдЧреИрд░-SQL-рд╕рдВрдЪрд╛рд▓рд┐рдд рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдЪреАрдЬреЗрдВ рдЗрддрдиреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВред рд╡рд┐рдХрд▓реНрдк рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣реЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрддрд┐-рд╕рдХреНрд░рд┐рдп рдирд╣реАрдВ рд╣реИрдВред DbFit FitNesse рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдмрд╣реБрдд рд╣реА рд░реЛрдЪрдХ рдЙрдкрдХрд░рдг рд╣реИред рдпрд╣ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд┐ рдорд╛рд░реНрдХрдЕрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╕реНрд▓реИрдХрд░ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рднреА рд╣реИ: BDD рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ DB рдХреЛрдб рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдореБрдЭреЗ рдЧреИрд░-рдПрд╕рдХреНрдпреВрдПрд▓-рд╕рдВрдЪрд╛рд▓рд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рдЕрднрд┐рдХрдерди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд╣рд▓реА рдирдЬрд░ рдореЗрдВ, рджрд╛рд╡реЗ рдХреА рдорд╛рддреНрд░рд╛ рдХрдо рд╣реИ, рдФрд░ рд╣рдо рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕реЗ рдЙрдкрдХрд░рдг рдмрджрддрд░ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реЗ рдореВрд▓ рд░реВрдк рд╕реЗ tSQLt рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреА рд╕рддрд╣реА рдЭрд▓рдХ рдЧрд▓рдд рд╣реИред
рдирд╡реАрдирддрдо рдкрдВрдХреНрддрд┐ - "NUnit, рдЖрджрд┐" - рдПрдХ рдЕрдиреБрд╕реНрдорд╛рд░рдХ рдХреА рддрд░рд╣ рд╣реИред рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ рдмрд╣реБрдд рд╕реА рд╕рд╛рдорд╛рдиреНрдп рдЗрдХрд╛рдИ-рдкрд░реАрдХреНрд╖рдг рд░реВрдкрд░реЗрдЦрд╛рдПрдБ DB рдХреЛрдб рдкрд░ рд▓рд╛рдЧреВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ N / A рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдИ рдЙрдкрдХрд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣ "рдЬреЛрд░" рдХреЙрд▓рдо рдореЗрдВ "рдмрд╛рд░реАрдХрд┐рдпреЛрдВ" рдХрд╛ рд╕реНрд░реЛрдд рд╣реИ - рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХрд░рдг рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдмрд╛рдд рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рднреА рджрд╛рд╡реЗ рдбреАрдмреА рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдореАрдЯреНрд░рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо
Google рд░реБрдЭрд╛рдиреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдмрд╛рд░реАрдХрд┐рдпреЛрдВ:
- рдореИрдВрдиреЗ рд╕реНрд▓реИрдХрд░ рдХреЛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдирд╛рдо рдХрд╛ рдорддрд▓рдм рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬреЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ (рдФрд░ "рд╕реНрд▓реИрдХрд░ рдлреНрд░реЗрдорд╡рд░реНрдХ" рдЬреИрд╕реЗ рдкреНрд░рд╢реНрди рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рдЧреНрд░рд╛рдл рдкрд░ рджреЗрдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВ)ред
- рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рд╕реЗ рдмрд╛рд╣рд░ (рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╕реНрд▓реЙрдЯ рдЦрд╛рд▓реА рд░рд╣рд╛), рдореИрдВрдиреЗ рдЯреАрдПрд╕рдЯреА рдкреНрд░рд╡реГрддреНрддрд┐ рдХреЛ рдЬреЛрдбрд╝рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╢рд╛рдпрдж рд╣реА рд╣рдореЗрдВ рдЕрд╕рд▓реА рддрд╕реНрд╡реАрд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рд╣реИ рдЬрд┐рд╕рдХрд╛ рдорддрд▓рдм рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬреЗрдВ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
- рдореИрдВрдиреЗ NUnit рдФрд░ рдЗрд╕рдХреЗ рдПрдирд╛рд▓реЙрдЧреНрд╕ рдХреЛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдпреЗ рдЙрдкрдХрд░рдг "рд╕рд╛рдорд╛рдиреНрдп" рдХреЛрдб рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд░реВрдкрд░реЗрдЦрд╛ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдирдХреЗ рд░реБрдЭрд╛рди рд╣рдорд╛рд░реЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рд╡рд░реНрдгрдирд╛рддреНрдордХ рдирд╣реАрдВ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, tSQLt рд╕реВрдЪреА рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЦреЛрдЬ рдпреЛрдЧреНрдп рдЙрдкрдХрд░рдг рд╣реИред рдПрдХ рдФрд░ (рдХрдо) рд▓реЛрдХрдкреНрд░рд┐рдп рдЙрдкрдХрд░рдг DbFit рд╣реИред рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреА рд╕реАрдорд┐рдд рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рд╣реИред
рджреНрд╡рд╛рд░рд╛ рдФрд░ рдмрдбрд╝реЗ, рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рдЦрд┐рд▓рд╛рдл tSQLt рдЪрдордХ рд░рд╣рд╛ рд╣реИред
TSQLt рдХреНрдпрд╛ рд╣реИ?
рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ tSQLt рдПрдХ SQL- рд╕рдВрдЪрд╛рд▓рд┐рдд рдЗрдХрд╛рдИ-рдкрд░реАрдХреНрд╖рдг рдврд╛рдБрдЪрд╛ рд╣реИред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рд╛рдЗрдЯ
https://tsqlt.org рд╣реИ ред
рдпрд╣ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ tSQLt 2005 SP2 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ SQL рд╕рд░реНрд╡рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╢реБрд░реБрдЖрддреА рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╣рдорд╛рд░реЗ рджреЗрд╡-рд╕рд░реНрд╡рд░ рдФрд░ реирежрез rev рдХреА рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рдкрд░ реирежрезреи рдХреА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИред
рдУрдкрди рд╕реЛрд░реНрд╕, Apache 2.0 рд▓рд╛рдЗрд╕реЗрдВрд╕,
GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ ред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╣рдо рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдореБрдлреНрдд рдореЗрдВ рдХрд╛рдВрдЯрд╛, рдпреЛрдЧрджрд╛рди, рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░, рдХреНрдпрд╛ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд╕реАрдПрд▓рдЖрд░ рдореЗрдВ рд╕реНрдкрд╛рдпрд╡реЗрдпрд░ рд╕реЗ рдбрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред
рдпрд╛рдВрддреНрд░рд┐рдХреА
рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдорд▓реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрдХреНрд╖рд╛рдУрдВ (рдПрдХреНрд╕рдпреВрдирд┐рдЯ рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдЯреЗрд╕реНрдЯ рд╕реВрдЯ) рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкрд░реАрдХреНрд╖рдг рдХрдХреНрд╖рд╛рдПрдВ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдбреАрдмреА рд╕реНрдХреАрдорд╛ рд╣реИрдВред tSQLt рдХреЛ рдЙрдиреНрд╣реЗрдВ NewTestClass рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрдХреНрд╖рд╛рдПрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдПрдХ SetUp рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░реАрдХреНрд╖рдг рдХреЗрд╕ рдЪрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдРрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЪрд▓реЗрдЧреАред
рдкрд░реАрдХреНрд╖рдг рдХреЗрд╕ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЯрд┐рдпрд░рдбрд╛рдЙрди-рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рд╕реЗрдЯрдЕрдк рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдорд╛рдорд▓рд╛ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдирджреЗрди рдореЗрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкрд░рд┐рдгрд╛рдо рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд╛рдкрд╕ рд▓реЗ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ - рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдереЛрдбрд╝рд╛ рдмрд╛рдж рдореЗрдВ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред
рд░реВрдкрд░реЗрдЦрд╛ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдкреВрд░реЗ рдкрд░реАрдХреНрд╖рдг рд╡рд░реНрдЧ рдпрд╛ рдПрдХ рдПрдХрд▓ рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╕рднреА рдкрдВрдЬреАрдХреГрдд рдкрд░реАрдХреНрд╖рдг рдХрдХреНрд╖рд╛рдПрдВред
рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдФрд░ рдЙрджрд╛рд╣рд░рдг
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЧрд╛рдЗрдб рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдирд┐рдЪреНрдЫреБрдХ, рдореИрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ tSQLt рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред
рдЕрд╕реНрд╡реАрдХрд░рдг:- рдЙрджрд╛рд╣рд░рдг рд╕рд░рд▓ рд╣реИрдВ
- рдореВрд▓ рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореЗрд░рд╛ рдирд╣реАрдВ рд╣реИ - рдмрд▓реНрдХрд┐ рд╕рд╛рдореВрд╣рд┐рдХ рд░рдЪрдирд╛ рд╣реИ
- рдЙрджрд╛рд╣рд░рдг 2 рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╣реИред
рдЙрджрд╛рд╣рд░рдг # 1: CsvSql
рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдХрд┐рд╕реА рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред Nvarchar (MAX) рдлрд╝реАрд▓реНрдб рдореЗрдВ SQL-рдХреНрд╡реЗрд░реАрдЬрд╝ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо UI рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрди рдкреНрд░рд╢реНрдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ CSV- рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдЧреЗ рдХреА рд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдмреИрдХрдПрдВрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред CSV- рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдкреАрдЖрдИ рдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ рдмрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХреЙрд▓рдо рд╣реЛрддреЗ рд╣реИрдВред рдРрд╕реЗ рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ рдХрд╛ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдЙрджрд╛рд╣рд░рдг:
рдпрд╣ рдкрд░рд┐рдгрд╛рдо рд╕реЗрдЯ рдиреИрджрд╛рдирд┐рдХ тАЛтАЛрдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП [рдХреНрд▓реАрдирд┐рдХрдирдо] рдЧрдгрдирд╛ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 2 рдЯреЗрдмрд▓ рд╣реИрдВ: [рдкрд░реАрдХреНрд╖рдг] рдФрд░ [рдХреНрд▓рд┐рдирд┐рдХ]ред
рдПрдХ FK рд╣реИ: [рдХреНрд▓рд┐рдирд┐рдХ]ред [рдкрд░реАрдХреНрд╖рдг] -> [рдкрд░реАрдХреНрд╖рдг] [рдкрд░реАрдХреНрд╖рдг]ред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдХрдИ рдХреНрд▓реАрдирд┐рдХреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП COUNT (*) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
SELECT COUNT(*), ... FROM dbo.Trial LEFT JOIN dbo.Clinic ON Trial.ID = Clinic.TrialID WHERE Trial.Name = @trialName GROUP BY ...
рд╣рдо рдРрд╕реА рдХреНрд╡реЗрд░реА рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реНрдЯрдм рдлрд╝реЗрдХрдЯреЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬреЛ рд╣рдорд╛рд░реЗ рдЖрдЧреЗ рдХреЗ рдХрд╛рдо рдХреЛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ред
EXEC tSQLt.FakeTable 'dbo.Trial'; EXEC tSQLt.FakeTable 'dbo.Clinic';
рдлрд╝реЗрдХрдЯреЗрдмрд▓ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмрд╛рдд рдХрд░рддрд╛ рд╣реИ - рдкреБрд░рд╛рдиреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде рдирдП рдмрдирд╛рддрд╛ рд╣реИред рд╕рдорд╛рди рдирд╛рдо, рд╕рдорд╛рди рдХреЙрд▓рдо, рд▓реЗрдХрд┐рди рдмрд╛рдзрд╛рдУрдВ рдФрд░ рдЯреНрд░рд┐рдЧрд░ рдХреЗ рдмрд┐рдирд╛ред
рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐:
- рдЯреЗрд╕реНрдЯ рдбреАрдмреА рдореЗрдВ рдХреБрдЫ рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЙрдЪрд┐рдд рднрд╛рдЧ рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВред FakeTable рд╣рдореЗрдВ рдЙрди рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
- рдЖрдорддреМрд░ рдкрд░, рд╣рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдХреБрдЫ рдХреЙрд▓рдо рднрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЕрдХреНрд╕рд░ рдмрд╛рдзрд╛рдПрдВ рдФрд░ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрддреЗ рд╣реИрдВред рд╣рдо рдмрд╛рдж рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВ - рд╣рдо рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдг рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдкрд░реАрдХреНрд╖рдг рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдиреНрдпреВрдирддрдо рд░рдЦрддреЗ рд╣реБрдПред
- рдХреЛрдИ рдЕрд╡рд╛рдВрдЫрд┐рдд рдЯреНрд░рд┐рдЧрд░ рд░рди рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдкреЛрд╕реНрдЯ-рдкреНрд░рднрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдлрд┐рд░ рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
INSERT INTO dbo.Trial ([ID], [Name]) VALUES (1, 'Valerian'); INSERT INTO dbo.Clinic ([ID], [TrialID], [Name]) VALUES (1, 1, 'Clinic1'), (2, 1, 'Clinic2');
рд╣рдо DB рд╕реЗ рдХреНрд╡реЗрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, [рд╡рд╛рд╕реНрддрд╡рд┐рдХ] рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рднрд░рддреЗ рд╣реИрдВ
рдХреНрд╡реЗрд░реА рд╕реЗ рд╕реЗрдЯ рдХрд░реЗрдВред
DECLARE @sqlStatement NVARCHAR(MAX) = (SELECTтАж CREATE TABLE actual ([TrialID], ...); INSERT INTO actual EXEC sp_executesql @sqlStatement, ...
рдЕрдм, рд╣рдо [рдЕрдкреЗрдХреНрд╖рд┐рдд] - рд╣рдорд╛рд░реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рднрд░рддреЗ рд╣реИрдВ:
CREATE TABLE expected ( ClinicsNum INT ); INSERT INTO expected SELECT 2
рдореИрдВ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ [рдЕрдкреЗрдХреНрд╖рд┐рдд] рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдХреЙрд▓рдо рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ [рд╡рд╛рд╕реНрддрд╡рд┐рдХ] рдХреЙрд▓рдо рдореЗрдВ рдкреВрд░рд╛ рд╕реЗрдЯ рд╣реИред
рдпрд╣ AssertEqualsTable рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдПрдХ рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдорд╛рди рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
EXEC tSQLt.AssertEqualsTable 'expected', 'actual', 'incorrect number of clinics';
рдпрд╣ рдХреЗрд╡рд▓ рдЙрди рд╕реНрддрдВрднреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рджреЛрдиреЛрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдХреНрд╡реЗрд░реА рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЙрд▓рдо рд▓реМрдЯрд╛рддреА рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рд╣рдо рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдХреЛ рдмрдврд╝рд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдПрдХ рджреЛрдзрд╛рд░реА рддрд▓рд╡рд╛рд░ рд╣реИред рдпрджрд┐ [рд╡рд╛рд╕реНрддрд╡рд┐рдХ] SELECT TOP 0 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднрд░рд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдХреЙрд▓рдо рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рддреЛ рдРрд╕рд╛ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ рдЗрд╕реЗ рдкрдХрдбрд╝ рдирд╣реАрдВ рдкрд╛рдПрдЧрд╛ред рдЗрд╕реЗ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреЗрдХ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
AservEqualsTable рдЬреБрдбрд╝рд╡рд╛рдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ
рдпрд╣ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХрд┐ tSQLt рдореЗрдВ AssertEqualsTable рдЬреИрд╕реА 2 рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рд╣реИрдВред рд╡реЗ AssertEqualsTableSchema рдФрд░ AssertResultSetsHaveSameMetaData рд╣реИрдВред рдкрд╣рд▓реЗ рдПрдХ AssertEqualsTable рдХреЗ рд░реВрдк рдореЗрдВ рд╣реА рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкрд░ред рджреВрд╕рд░рд╛ рдПрдХ рд╣реА рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкрд░ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг # 2: рдмрд╛рдзрд╛рдУрдВ
рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдиреЗ рд╣рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, рдмрд╛рдзрд╛рдПрдВ рддрд░реНрдХ рдХрд╛ рднреА рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╕реНрдерд┐рддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред 2 рдЯреЗрдмрд▓ - [рдкрд░реАрдХреНрд╖рдг] рдФрд░ [рдХреНрд▓рд┐рдирд┐рдХ]; [рдкрд░реАрдХреНрд╖рдг] FK:
рдЖрдЗрдП рдЗрд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рдкрд┐рдЫрд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдирдХрд▓реА рдХрд░рддреЗ рд╣реИрдВ:
EXEC tSQLt.FakeTable '[dbo].[Trial]' EXEC tSQLt.FakeTable '[dbo].[Clinic]'
рдЙрджреНрджреЗрд╢реНрдп рдПрдХ рд╣реА рд╣реИ - рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕реАрдорд╛рдУрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ред рд╣рдо рдЕрдиреБрдЪрд┐рдд рдкреНрд░рдпрд╛рд╕ рдХреЗ рдмрд┐рдирд╛ рдкреГрдердХ рдЪреЗрдХ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛, рд╣рдо рдЙрд╕ рдмрд╛рдзрд╛ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо ApplyConstraint рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
EXEC tSQLt.ApplyConstraint '[dbo].[Clinic]', 'Trial_FK';
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЪреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИред рдЪреЗрдХ рд╣реА рдпрд╣ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдбрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рдЕрдкрд╡рд╛рдж рд╣реЛрдЧрд╛ред рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рдкрд╛рд╕ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд░ ExpectException рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред
EXEC tSQLt.ExpectException @ExpectedMessage = 'The INSERT statement conflicted...', @ExpectedSeverity = 16, @ExpectedState = 0;
рд╣рдо рд╣реИрдВрдбрд▓рд░ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдиреЙрди-рдЗрдВрд╕рд░реНрдЯреЗрдмрд▓ рдбрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
INSERT INTO [dbo].[Clinic] ([TrialID]) VALUES (1)
рдЕрдкрд╡рд╛рдж рдкрдХрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдЯреЗрд╕реНрдЯ рдкрд╛рд╕ред
ApplyConstraint рдЬреБрдбрд╝рд╡рд╛рдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ
TSQLt рд▓реЗрдЦрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд░реАрдХреНрд╖рдг рдЯреНрд░рд┐рдЧрд░реНрд╕ рдХрд╛ рддрд░реАрдХрд╛ рдкрд░реАрдХреНрд╖рдг рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рдорд╛рди рд╣реИред рд╣рдо рдореЗрдЬ рдкрд░ рдЯреНрд░рд┐рдЧрд░ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП ApplyTrigger рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕рдм рдХреБрдЫ рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЯреНрд░рд┐рдЧрд░ рд╢реБрд░реВ рдХрд░реЗрдВ, рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред
ExpectNoException - ExpectException's antonym
рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ ExpectNoException рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред рдпрд╣ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдПрдХреНрд╕рдкреЗрдХреНрдЯреЗрд╢рди рдЕрдкрд╡рд╛рдж рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЕрдкрд╡рд╛рдж рд╣реЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПред
рдЙрджрд╛рд╣рд░рдг # 3: рд╕реЗрдорд╛рдлреЛрд░
рдХреБрдЫ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд╛рд░реНрдпрд╡рд┐рдзрд┐рдпрд╛рдБ рдФрд░ рд╡рд┐рдВрдбреЛрдЬрд╝ рд╕реЗрд╡рд╛рдПрдБ рд╣реИрдВред рдЙрдирдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╢реБрд░реБрдЖрдд рд╡рд┐рднрд┐рдиреНрди рдмрд╛рд╣рд░реА рдШрдЯрдирд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдирдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдХреНрд░рдо рддрдп рд╣реИред рддреЛ, рдпрд╣ рдбреАрдмреА рдХреА рддрд░рдл рдПрдХреНрд╕реЗрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ - рдпрд╛рдиреА рдПрдХ рд╕реЗрдореАрдлреЛрд░ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реЗрдорд╛рдлреЛрд░ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИред
рдЖрдЗрдП рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЕрд░реНрдзрд╡реГрддреНрдд рдХреЗ рднреАрддрд░ рджреЗрдЦреЗрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 2 рдЯреЗрдмрд▓ рд╣реИрдВ - [рдкреНрд░рдХреНрд░рд┐рдпрд╛] рдФрд░ [рдкреНрд░реЛрдХреИрд╕реНрдЯрд╕]:
[рдкреНрд░рдХреНрд░рд┐рдпрд╛] рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЕрдиреБрдордд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рд╕реВрдЪреА рд╣реИред [ProcStatus], рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдкрд┐рдЫрд▓реА рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рд╕реВрдЪреА рд╢рд╛рдорд┐рд▓ рд╣реИред
рддреЛ, рд╣рдорд╛рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ:
- рд╣рдордиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╛рдо рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдирд╛рдо [рдкреНрд░рдХреНрд░рд┐рдпрд╛] рддрд╛рд▓рд┐рдХрд╛ рдХреЗ [рдирд╛рдо] рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЦреЛрдЬрд╛ рдЧрдпрд╛ рд╣реИред
- рдпрджрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдирд╛рдо рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ [рдкреНрд░рдХреНрд░рд┐рдпрд╛] рддрд╛рд▓рд┐рдХрд╛ рдХреЗ [IsRunable] рдЭрдВрдбреЗ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред
- рдпрджрд┐ рдЭрдВрдбрд╛ рдЪрд╛рд▓реВ рд╣реИ, рддреЛ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЪрд▓ рд╕рдХрддреА рд╣реИред рдЕрдВрддрд┐рдо рдЬрд╛рдВрдЪ [ProcStatus] рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╣реЛрддреА рд╣реИред рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд╣реАрдВ рдЪрд▓ рд░рд╣реА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ [рдкреНрд░реЛрдХреИрд╕реНрдЯрд╕] рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ "рдЗрдирдкреНрд░реЛрдЧ" рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ред
рдпрджрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ рдФрд░ рд╕рднреА рдЪреЗрдХ рдкрд╛рд╕ рд╣реЛ рдЧрдП рд╣реИрдВ, рддреЛ рд╣рдо рдЕрдкрдиреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдирдпрд╛ рд░рд┐рдХреЙрд░реНрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ [ProcStatus] рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕реНрдерд┐рддрд┐ "InProg" рдХреЗ рд╕рд╛рдеред рдЗрд╕ рдирдП рд░рд┐рдХреЙрд░реНрдб рдХреА рдЖрдИрдбреА ProcStatusId рдЖрдЙрдЯрдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖ рдЧрдИ рд╣реИред
рдЕрдЧрд░ рдХреБрдЫ рдЧрд▓рдд рд╣реБрдЖ рд╣реИ, рддреЛ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ:
- рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рд╢рд╛рд╕рдХ рдХреЛ рдПрдХ рдИрдореЗрд▓ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред
- ProcStatusId = -1 рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
- рдХреЛрдИ рдирдпрд╛ [ProcStatus] рд░рд┐рдХреЙрд░реНрдб рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред
рдЪрд▓реЛ [рдкреНрд░рдХреНрд░рд┐рдпрд╛] рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ рдмрдирд╛рдПрдВред
рд╣рдо рдлрд╝реЗрдХрдЯреЗрдмрд▓ рдХрд╛ рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдпрд╣рд╛рдБ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐:
- рдпрд╣ рдЧрд╛рд░рдВрдЯреА рд╣реИ рдХрд┐ рдХреЛрдИ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
- рдирдП [ProcStatus] рд░рд┐рдХреЙрд░реНрдб рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЖрдЧреЗ рдХреА рдЬрд╛рдВрдЪ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
EXEC tSQLt.FakeTable 'dbo.Process'; EXEC tSQLt.FakeTable 'dbo.ProcStatus';
рдПрдХ [SendEmail] рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рдмреЛрд▓рддрд╛ рд╣реИред рд╣рдореЗрдВ рдЗрд╕рдХреА рдХреЙрд▓ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред tSQLt рдЙрд╕рдХреЗ рд▓рд┐рдП SpyProcedure рдореЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИред
EXEC tSQLt.SpyProcedure 'dbo.SendEmail'
SpyProcedure рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рддрд╛ рд╣реИ:
- рдПрдХ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ [dbo] рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред [рдкреНрд░рдХреНрд░рд┐рдпрд╛ .Name_SpyProcedureLog]
- рдлрд╝реЗрдХрдЯреЗрдмрд▓ рдХреА рддрд░рд╣, рдореВрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде, рд▓реЗрдХрд┐рди рдЕрдВрджрд░ рд▓реЙрдЬрд┐рдХ рд▓реЙрдЬрд┐рдХ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рддрд░реНрдХ рднреА рдЙрддреНрдкрдиреНрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд▓реЙрдЧ [dbo] рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рд╣реИрдВред [SendEmail_SpyProcedureLog] рддрд╛рд▓рд┐рдХрд╛ред рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ [_ID_] рдХреЙрд▓рдо рд╣реИ рдЬреЛ рдХреЙрд▓ рдХреЗ рдЕрдиреБрдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣реИред рдмрд╛рдж рдХреЗ рд╕реНрддрдВрднреЛрдВ рдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдирд╛рдо рдкрд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рднреА рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЖрдЦрд┐рд░реА рдЪреАрдЬрд╝ рдЬреЛ рд╣рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдЙрд╕рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗрдореАрдлреЛрд░ рдХреЙрд▓ рдХреЛ [ProcStatusId] рдорд╛рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, -1, рдЬреИрд╕рд╛ рдХрд┐ рд░рд┐рдХреЙрд░реНрдб рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛)ред
DECLARE @ProcStatusId BIGINT;
рд╣рдо рд╕реЗрдорд╛рдлреЛрд░ рдХрд╣рддреЗ рд╣реИрдВ:
EXEC dbo.[Semaphore_JobStarter] 'SomeProcess', @ProcStatusId OUTPUT; -- here we get -1
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЪреЗрдХ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдбреЗрдЯрд╛ рд╣реИрдВред рдЪрд▓реЛ рдЬрд╛рдБрдЪ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ
рдпрд╣ рд╕рдВрджреЗрд╢ рднреЗрдЬрд╛ рдЧрдпрд╛ рд╣реИред
IF NOT EXISTS ( SELECT * FROM dbo.SendEmail_SpyProcedureLog) EXEC tSQLt.Fail 'SendEmail has not been run.';
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдкрд╛рд░рд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рднреЗрдЬрдиреЗ рдХреЗ рддрдереНрдп рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдлреЗрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрд╣ рд╣рдореЗрдВ "рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░" рдПрдХ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдХреЛ рд╡рд┐рдлрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рдкрд░рд┐рд╖реНрдХреГрдд рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдлреЗрд▓ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЕрдм рд╣рдо AssertEmptyTable рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде [ProcStatus] рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред
EXEC tSQLt.AssertEmptyTable 'dbo.ProcStatus';
рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣рдордиреЗ рдЬреЛ FakeTable рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛, рдЙрд╕рдиреЗ рд╣рдорд╛рд░реА рдорджрдж рдХреАред рдЗрд╕рдХреЗ рд╕рд╛рде, рд╣рдо рдХреЛрдб рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЦрд╛рд▓реА рддрд╛рд▓рд┐рдХрд╛ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреА рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЯреЗрдмрд▓ рдлреЗрдХрд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ ProcStatusId = -1 рд╕рдорд╛рдирддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
EXEC tSQLt.AssertEquals -1, @ProcStatusId, 'Wrong ProcStatusId.';
рдЕрднрд┐рдХрдерди рдиреНрдпреВрдирддрдо рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл 2 рдореВрд▓реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ, рдЕрд╕рд╛рдзрд╛рд░рдг рдХреБрдЫ рднреА рдирд╣реАрдВред
AservEquals рдЬреБрдбрд╝рд╡рд╛рдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореВрд▓реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рд╣реИрдВ:
- AssertEquals
- AssertNotEquals
- AssertEqualsString
- AssertLike
рдирд╛рдо рд╕реНрд╡-рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рд╣реИрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрд┐рд╕ рдкрд░ рдореИрдВ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ рдПрд╕реЗрдЯрд░реНрдХреНрд╡рд╛рд▓реНрд╕рд╕реНрдЯреНрд░рд┐рдВрдЧред рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред рд╣рдореЗрдВ рджрд┐рдП рдЧрдП рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдмрд╛рдд рдпрд╣ рд╣реИ, AssertEquals / AssertNotEquals / AssertLike SQL_VARIANT рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред NVARCHAR (MAX) SQL_VARIANT рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП tSQLt рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреА рдкрдбрд╝реАред
рдирдХрд▓реА рдХрд╛рд░реНрдп
рдПрдХ рдзрдХреНрдХрд╛ рдкрд░, рд╣рдо FakeFunction рдХреЛ SpyProcedure рдХреЗ рд╕рдорд╛рди рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдирдХрд▓реА рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рд░рд▓ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ SQL рд╕рд░реНрд╡рд░ рдлрд╝рдВрдХреНрд╢рди рдЯреВрдердкреЗрд╕реНрдЯ рдЯреНрдпреВрдм рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдкрд░рд┐рдгрд╛рдо рдХреЗрд╡рд▓ "рдЫреЗрдж" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ), рдпрд╣ рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдЕрд╕рдВрднрд╡ рд╣реИред рдЖрдВрддрд░рд┐рдХ рддрд░реНрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдПрдХрдорд╛рддреНрд░ рдЙрдкрд▓рдмреНрдз рддрд░реАрдХрд╛ рд╣реИред
рдиреБрдХрд╕рд╛рди
рдореИрдВ рдЖрдкрдХреЛ рдХреБрдЫ рдиреБрдХрд╕рд╛рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬрд┐рдирдХрд╛ рдЖрдк tSQLt рдЙрдкрдпреЛрдЧ рдХреЗ рджреМрд░рд╛рди рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ "рдиреБрдХрд╕рд╛рди" рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреБрдЫ рдореБрджреНрджреЗ рдЬреЛ SQL рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдмрдВрдз рдФрд░ / рдпрд╛ рдЬреЛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред
рд▓реЗрди-рджреЗрди рд░реЛрд▓рдмреИрдХ рдФрд░ рдбреВрдорд┐рдВрдЧ
рд╣рдорд╛рд░реА рдЯреАрдо рдХреЗ рд╕рд╛рдордиреЗ рдкрд╣рд▓реА рдФрд░ рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рд▓реЗрди-рджреЗрди рд░реЛрд▓рдмреИрдХ рдФрд░ рдбреВрдорд┐рдВрдЧ рд╣реИред SQL рд╕рд░реНрд╡рд░ рдиреЗрд╕реНрдЯреЗрдб рдЯреНрд░рд╛рдВрдЬреЗрдХреНрд╢рди рдХреЛ рдЕрд▓рдЧ рд╕реЗ рд░реЛрд▓рдмреИрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рднреА рд▓реЗрди-рджреЗрди рдХреЛ рд╕рдмрд╕реЗ рдмрд╛рд╣рд░реА рддрдХ рд╡рд╛рдкрд╕ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ tSQLt рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдирджреЗрди рдореЗрдВ рд▓рдкреЗрдЯрддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдмрди рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдВрджрд░ рд░реЛрд▓рдмреИрдХ рдПрдХ рдЧреИрд░-рд╡рд░реНрдгрдирд╛рддреНрдордХ рдирд┐рд╖реНрдкрд╛рджрди рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░реАрдХреНрд╖рдг рд░рди рдХреЛ рддреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред
рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рд╕реЗрд╡рдкреЙрдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╡рд┐рдЪрд╛рд░ рд╕рд░рд▓ рд╣реИред рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рд▓реЗрдирджреЗрди рдХреЗ рдЕрдВрджрд░ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рд╣рд╛рдБ, рддреЛ рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ tSQLt рд▓реЗрдирджреЗрди рд╣реИ рдФрд░ рдПрдХ рд╕реЗрд╡ рдкреЙрдЗрдВрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рд╣рдо рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдо рдПрдХ рдирдпрд╛ рд▓реЗрдирджреЗрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред

рд╕рдорд╕реНрдпрд╛ рд▓реЗрдирджреЗрди рдбреВрдЗрдВрдЧ рджреНрд╡рд╛рд░рд╛ рдЬрдЯрд┐рд▓ рд╣реИ - рдпрд╣ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдбреВрдо рдХрд┐рдП рдЧрдП рд▓реЗрди-рджреЗрди рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдПрдХ рд╕реЗрд╡ рдкреЙрдЗрдВрдЯ рдкрд░ рд╡рд╛рдкрд╕ рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрджреНрдз рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╕рдмрд╕реЗ рдмрд╛рд╣рд░реА рдЯреНрд░рд╛рдВрдЬреИрдХреНрд╢рди рдкрд░ рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
DECLARE @isNestedTransaction BIT = CASE WHEN @@trancount > 0 THEN 'true' ELSE 'false' END; BEGIN TRY IF @isNestedTransaction = 'false' BEGIN TRANSACTION ELSE SAVE TRANSACTION SavepointName;
рдЖрдЗрдП рдХреЛрдб рдЯреБрдХрдбрд╝рд╛ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рд▓реЗрдирджреЗрди рдХреЗ рдЕрдВрджрд░ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред
DECLARE @isNestedTransaction BIT = CASE WHEN @@trancount > 0 THEN 'true' ELSE 'false' END;
@IsNestedTransaction рдзреНрд╡рдЬ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо TRY- рдмреНрд▓реЙрдХ рдХреЛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдмрдЪрдд рдмрд┐рдВрджреБ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓реЗрдирджреЗрди рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
BEGIN TRY IF @isNestedTransaction = 'false' BEGIN TRANSACTION ELSE SAVE TRANSACTION SavepointName;
рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкрд░рд┐рдгрд╛рдо рджреЗрддреЗ рд╣реИрдВ рдпрджрд┐ рдпрд╣ рдПрдХ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред
рдмреЗрд╢рдХ, рдЕрдЧрд░ рдпрд╣ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред tSQLt рдЕрдВрдд рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░реЗрдЧрд╛ред
рдпрджрд┐ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реЛ рдЧрдИ рд╣реИ рдФрд░ рд╣рдо CATCH рдмреНрд▓реЙрдХ рдореЗрдВ рдкрд╣реБрдВрдЪ рдЧрдП рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд▓реЗрдирджреЗрди рд╕рд░рд╛рд╣рдиреАрдп рд╣реИ рдпрд╛ рдирд╣реАрдВред
BEGIN CATCH DECLARE @isCommitable BIT = CASE WHEN XACT_STATE() = 1 THEN 'true' ELSE 'false' END;
рд╣рдо рдХреЗрд╡рд▓ рддрднреА рд╡рд╛рдкрд╕ рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм:
- рд▓реЗрдирджреЗрди рд╕рд░рд╛рд╣рдиреАрдп рд╣реИ
- рдпрд╣ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд░рди рд╣реИ, рдЗрд╕рд▓рд┐рдП, savepoint рдореМрдЬреВрдж рд╣реИред
рдЕрдиреНрдп рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣рдореЗрдВ рдкреВрд░реЗ рд▓реЗрдирджреЗрди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
IF @isCommitable = 'true' AND @isNestedTransaction = 'true' ROLLBACK TRANSACTION SavepointName; ELSE ROLLBACK; THROW; END CATCH;
рд╣рд╛рдВ, рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рдпрджрд┐ рд╣рдо рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рдмрд┐рдирд╛ рд▓реЗрди-рджреЗрди рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд╣реБрдВрдЪ рдЧрдП рд╣реИрдВ, рддреЛ рднреА рд╣рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред
Faketable рдФрд░ рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬреА рдореБрджреНрджрд╛
рдЖрдЗрдП рдкрд░рд┐рдЪрд┐рдд [рдкрд░реАрдХреНрд╖рдг] рдФрд░ [рдХреНрд▓рд┐рдирд┐рдХ] рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ
рд╣рдо [рдкрд░реАрдХреНрд╖рдг] рдПрдлрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╣рдордиреЗ рджреЛрдиреЛрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдкрд░ рдлреЗрдХрдЯреЗрдмрд▓ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдпрджрд┐ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЙрдиреНрд╣реАрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗрдЯрдЕрдк рддрдХ рдкрд╣реБрдБрдЪреЗрдВрдЧреЗ:
рдЗрд╕рд▓рд┐рдП, [рдХреНрд▓рд┐рдирд┐рдХ] рдореЗрдВ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╣рдордиреЗ [рдкрд░реАрдХреНрд╖рдг] рдХреЗ рдирдХрд▓реА-рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рд╣реЛред
[dbo].[Test_FK_Problem] failed: (Error) The INSERT statement conflicted with the FOREIGN KEY constraint "Trial_Fk". The conflict occurred in database "HabrDemo", table "dbo.tSQLt_tempobject_ba8f36353f7a44f6a9176a7d1db02493", column 'TrialID'.[16,0]{Test_FK_Problem,14}
рдирд┐рд╖реНрдХрд░реНрд╖: рдирдХрд▓реА рд╕рднреА рдпрд╛ рдХреЛрдИ рднреА рдирд╣реАрдВред рдХреЛрдИ рдирд╣реАрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЖрдкрдХреЛ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдбреАрдмреА рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдкрд░ SpyProcedure
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдо рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЬрд╛рд╕реВрд╕реА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ:
[HabrDemo].[test_test] failed: (Error) Cannot use SpyProcedure on sys.sp_help because the procedure does not exist[16,10] {tSQLt.Private_ValidateProcedureCanBeUsedWithSpyProcedure,7}
рд╕реЗрдорд╛рдлреЛрд░ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ [SendEmail] рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдХреЙрд▓ рдХреЛ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛, рдЬреЛ рд╣рдорд╛рд░реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдг рджреНрд╡рд╛рд░рд╛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреБрдЫ рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдЗрдВрдЯрд░рд▓реЗрдпрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирд╕рд┐рдХ рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкреЗрд╢реЗрд╡рд░реЛрдВ
рддреНрд╡рд░рд┐рдд рд╕реНрдерд╛рдкрдирд╛
tSQLt рд╕реНрдерд╛рдкрдирд╛ рдореЗрдВ 2 рдЪрд░рдг рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рд▓рдЧрднрдЧ 2 рдорд┐рдирдЯ рд▓рдЧрддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдХреНрд░рд┐рдп рдирд╣реАрдВ рд╣реИ рдФрд░ рдПрдХ рд╣реА рдПрд╕рдХреНрдпреВрдПрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕реАрдПрд▓рдЖрд░ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдмрд╕ рдЗрддрдирд╛ рд╣реА: рдЕрдм рдЖрдк рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рдЯреЗрд╕реНрдЯ рдХреНрд▓рд╛рд╕ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рддреНрд╡рд░рд┐рдд рд╢рд┐рдХреНрд╖рд╛
tSQLt рд╕реАрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрджрд┐рд╡рд╕ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдерд╛ред рдореИрдВрдиреЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рд╕реЗ рдкреВрдЫрд╛ рдФрд░ рдпрд╣ рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд▓рдЧрднрдЧ 1 рдХрд╛рд░реНрдпрджрд┐рд╡рд╕ рд▓реЗрддрд╛ рд╣реИред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред
рддреНрд╡рд░рд┐рдд рд╕реАрдЖрдИ рдПрдХреАрдХрд░рдг
рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ CI рдПрдХреАрдХрд░рдг рдХреЛ рд╕реЗрдЯрдЕрдк рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрднрдЧ 2 рдШрдВрдЯреЗ рдХрд╛ рд╕рдордп рд▓рдЧрд╛ред рд╕рдордп рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдЬрд▓реНрджреА рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╡реНрдпрд╛рдкрдХ рд╕реЗрдЯ
рдпрд╣ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ tSQLt рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕рдореГрджреНрдз рд╣реИ рдФрд░ рд╢реЗрд░ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рджреБрд░реНрд▓рдн рдФрд░ рдкрд░рд┐рд╖реНрдХреГрдд рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдлреЗрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреНрд░рд▓реЗрдЦрди
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЧрд╛рдЗрдб рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╕реБрд╕рдВрдЧрдд рд╣реИрдВред рднрд▓реЗ рд╣реА рдпрд╣ рдЖрдкрдХрд╛ рдкрд╣рд▓рд╛ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдЯреВрд▓ рд╣реЛ, рдЖрдк рдЫреЛрдЯреА рдЕрд╡рдзрд┐ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ tSQLt рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рд╛рдл рдЙрддреНрдкрд╛рджрди
рдкрд░реАрдХреНрд╖рдг рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд╛рда рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
[tSQLtDemo].[test_error_messages] failed: (Failure) Expected an error to be raised. [tSQLtDemo].[test_tables_comparison] failed: (Failure) useful and descriptive error message Unexpected/missing resultset rows! |_m_|Column1|Column2| +---+-------+-------+ |< |2 |Value2 | |= |1 |Value1 | |= |3 |Value3 | |> |2 |Value3 | +----------------------+ |Test Execution Summary| +----------------------+ |No|Test Case Name |Dur(ms)|Result | +--+------------------------------------+-------+-------+ |1 |[tSQLtDemo].[test_constraint] | 83|Success| |2 |[tSQLtDemo].[test_trial_view] | 83|Success| |3 |[tSQLtDemo].[test_error_messages] | 127|Failure| |4 |[tSQLtDemo].[test_tables_comparison]| 147|Failure| ----------------------------------------------------------------------------- Msg 50000, Level 16, State 10, Line 1 Test Case Summary: 4 test case(s) executed, 2 succeeded, 2 failed, 0 errored. -----------------------------------------------------------------------------
рдпрд╣ рднреА DB (рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп) рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ...
... рдпрд╛ XML рдХреЗ рд░реВрдк рдореЗрдВ рднреАред
<?xml version="1.0" encoding="UTF-8"?> <testsuites> <testsuite id="1" name="tSQLtDemo" tests="3" errors="0" failures="1" timestamp="2019-06-22T16:46:06" time="0.433" hostname="BLAHBLAHBLAH\SQL2017" package="tSQLt"> <properties /> <testcase classname="tSQLtDemo" name="test_constraint" time="0.097" /> <testcase classname="tSQLtDemo" name="test_error_messages" time="0.153"> <failure message="Expected an error to be raised." type="tSQLt.Fail" /> </testcase> <testcase classname="tSQLtDemo" name="test_trial_view" time="0.156" /> <system-out /> <system-err /> </testsuite> </testsuites>
рдЕрдВрддрд┐рдо рдкреНрд░рд╛рд░реВрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ CI рдПрдХреАрдХрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдо рдПрдЯрд▓рд╕рд┐рдпрди рдмрд╛рдВрд╕ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ tSQLt рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рд░реЗрдбрдЧреЗрдЯ рдХрд╛ рд╕рдорд░реНрдерди
рдкреЗрд╢реЗрд╡рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдбреАрдмреАрдП рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд╕рдорд░реНрдерди рдХрд╛ рдирд╛рдо рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ - рд░реЗрдбрдЧреЗрдЯред рдПрд╕рдХреНрдпреВрдПрд▓ рдЯреЗрд╕реНрдЯ рдирд╛рдо рдХрд╛ рдЙрдирдХрд╛ SQL рд╕рд░реНрд╡рд░ рдореИрдиреЗрдЬрдореЗрдВрдЯ рд╕реНрдЯреВрдбрд┐рдпреЛ рдкреНрд▓рдЧрдЗрди рд╢реБрд░реВ рд╕реЗ tSQLt рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, RedGate
Google рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдЙрдирдХреЗ рд╢рдмреНрджреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, tSQLt рдХреЗ рдореБрдЦреНрдп рдбреЗрд╡рд▓рдкрд░ рдХреЛ рджреЗрд╡-рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рддрд╛ рд╣реИред
рд╡рд┐рдкрдХреНрд╖
рдХреЛрдИ рдЕрд╕реНрдерд╛рдпреА рдЯреЗрдмрд▓ рдлрд╝реЗрдХрд┐рдВрдЧ рдирд╣реАрдВ
tSQLt рдлрд╝реЗрдХрд┐рдВрдЧ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рд╡рд┐рдЪрд╛рд░, рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдПрдХ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рдПрдбрдСрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ addon SQL Server 2016+ рдХреЗ рд╕рд╛рде рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдмрд╛рд╣рд░реА DBs рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
tSQLt рдХреЛ рдЙрд╕реА DB рдореЗрдВ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реНрдерд╛рдкрд┐рдд рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдмрд╛рд╣рд░реА рдбреАрдмреА рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХрдо рд╕реЗ рдХрдо, рдирдХрд▓реА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
CREATE PROCEDURE [tSQLtDemo].[test_outer_db] AS BEGIN SELECT TOP 10 * FROM [AdventureWorks2017].[Person].[Password] EXEC tSQLt.FakeTable '[AdventureWorks2017].[Person].[Password]' SELECT TOP 10 * FROM [AdventureWorks2017].[Person].[Password] END
рдпрд╣ рдореБрдЦрд░ рдХрд╛рд░реНрдп рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдХреА рдХрд╛рд░реНрдпрд╢реАрд▓рддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗред
CREATE PROCEDURE [tSQLtDemo].[test_outer_db_assertions] AS BEGIN SELECT TOP 1 * INTO
рдкреНрд░рд▓реЗрдЦрди рдХреАрдбрд╝реЗ
рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЧрд╛рдЗрдб рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╕реБрд╕рдВрдЧрдд рд╣реИрдВ, рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдХреБрдЫ рдореБрджреНрджреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ рдкреБрд░рд╛рдиреЗ рд╣рд┐рд╕реНрд╕реЗ рд╣реЛрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг 1.
"рдХреНрд╡рд┐рдХ рд╕реНрдЯрд╛рд░реНрдЯ рдЧрд╛рдЗрдб" рд╕реЗ рд╕реЛрд░реНрд╕рдлреЙрд░реНрдЧ рд╕реЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рдорд┐рд▓рддрд╛ рд╣реИред
рд╡реЗ
2015 рдореЗрдВ SourceForge рд╕реЗ рдЪрд▓реЗ рдЧрдПред
рдЙрджрд╛рд╣рд░рдг 2.
ApplyConstraint рдЧрд╛рдЗрдб рдЕрдкрд╡рд╛рдж рдЕрдкрд╡рд╛рдж рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрдВрджрд░ рд╡рд┐рдлрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рднрд╛рд░реА рдбрд┐рдЬрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ ExpectException рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдХреЛрдб рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
CREATE PROCEDURE ConstraintTests.[test ReferencingTable_ReferencedTable_FK prevents insert of orphaned rows] AS BEGIN EXEC tSQLt.FakeTable 'dbo.ReferencedTable'; EXEC tSQLt.FakeTable 'dbo.ReferencingTable'; EXEC tSQLt.ApplyConstraint 'dbo.ReferencingTable','ReferencingTable_ReferencedTable_FK'; DECLARE @ErrorMessage NVARCHAR(MAX); SET @ErrorMessage = ''; BEGIN TRY INSERT INTO dbo.ReferencingTable ( id, ReferencedTableId ) VALUES ( 1, 11 ) ; END TRY BEGIN CATCH SET @ErrorMessage = ERROR_MESSAGE(); END CATCH IF @ErrorMessage NOT LIKE '%ReferencingTable_ReferencedTable_FK%' BEGIN EXEC tSQLt.Fail 'Expected error message containing ''ReferencingTable_ReferencedTable_FK'' but got: ''',@ErrorMessage,'''!'; END END GO
рдФрд░ рдпрд╣ рдЙрдореНрдореАрдж рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ ...
рдЖрдВрд╢рд┐рдХ рдкрд░рд┐рддреНрдпрд╛рдЧ
2016 рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдЬреВрди 2019 рддрдХ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдПрдХ рд▓рдВрдмрд╛ рд╡рд┐рд░рд╛рдо рдерд╛ред рд╣рд╛рдВ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рдЙрдкрдХрд░рдг рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЧрд┐рдЯрд╣рдм рдХреЗ рдЕрдиреБрд╕рд╛рд░ , рд╡рд┐рдХрд╛рд╕ рдзреАрд░реЗ-рдзреАрд░реЗ 2019 рдореЗрдВ рд╢реБрд░реВ рд╣реЛ
рдЧрдпрд╛ рд╣реИ ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Google рд╕рдореВрд╣реЛрдВ рдХреЗ
рдкрд╛рд╕ рдПрдХ рдзрд╛рдЧрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕реЗрдмрд╕реНрдЯрд┐рдпрди, рдореБрдЦреНрдп tSQLt рдбреЗрд╡рд▓рдкрд░, рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдВрддрд┐рдо рдкреНрд░рд╢реНрди 2 рдорд╛рд░реНрдЪ 2019 рдХреЛ рдкреВрдЫрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХрд╛ рдХреЛрдИ рдЙрддреНрддрд░ рдирд╣реАрдВ рдерд╛ред
SQL рд╕рд░реНрд╡рд░ 2017 рд╕рдорд╕реНрдпрд╛
рдпрджрд┐ рдЖрдк SQL Server 2017 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ tSQLt рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред Microsoft рдиреЗ рдЗрд╕ рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рдмрд╛рдж 2012 рдореЗрдВ рдкрд╣рд▓рд╛ рд╕реБрд░рдХреНрд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред "рд╕реАрдПрд▓рдЖрд░ рд╕рдЦреНрдд рд╕реБрд░рдХреНрд╖рд╛" рд╕рд░реНрд╡рд░-рд╕реНрддрд░реАрдп рдзреНрд╡рдЬ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдзреНрд╡рдЬ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЕрд╕реЗрдВрдмрд▓реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд░реЛрдХ рджреЗрддрд╛ рд╣реИ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реЗрдл)ред рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреЗ рд╣рдХрджрд╛рд░ рд╣реИрдВ (рдФрд░, рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдорд╛рд░реЗ
рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрдЪреНрдЫрд╛ рд╣реИ; рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рд▓реЗрдЦреЛрдВ рдХрд╛ рдкрд╛рд▓рди рднреА рджреЗрдЦреЗрдВред рдмрд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдорд╛рдирд╕рд┐рдХ рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рд░рд╣реЗрдВред
рдмреЗрд╢рдХ, рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ "рдиреБрдХрд╕рд╛рди" рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдард╣рд░рд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ tSQLt рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
GitHub рдХрд╛ рдореБрджреНрджрд╛ рдкрд╣рд▓реЗ рд╣реА рдЙрда рдЪреБрдХрд╛ рд╣реИ ред рдлрд┐рд░ рднреА, рдЕрдХреНрдЯреВрдмрд░ 2017 рд╕реЗ рдЗрд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЕрдиреНрдп DBMS рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк (┬▒)
tSQLt рдПрдХ рддрд░рд╣ рдХрд╛ рдирд╣реАрдВ рд╣реИред рдпрджреНрдпрдкрд┐ рдЖрдк CLR рдФрд░ T-SQL рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рдЕрдиреНрдп DBMS рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рднреА рдЖрдк рдХреБрдЫ рд╕рдорд╛рди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпреЗ рд╡рд┐рдХрд▓реНрдк tSQLt рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ SQL- рд╕рдВрдЪрд╛рд▓рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдгред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, PostgreSQL рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
pgTAP рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдФрд░ рдЯреИрдк рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП рдореВрд▓ PL / pgSQL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдФрд░ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╛рд╕рд╢реАрд▓ рдЯреВрд▓ рд╣реИред рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдЯреВрд▓
MyTap рдЖрдкрдХреЛ MySQL рдХреЗ рддрд╣рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдврд╛рдВрдЪрд╛ pgTAP рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдХрдо рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реИ рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдпрд╣ рд╕рдХреНрд░рд┐рдп рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рднреА рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ Oracle рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг
utPLSQL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдореИрдВ 2 рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛:
рдкрд╣рд▓рд╛: DB рдХреЛрдб рдкрд░реАрдХреНрд╖рдг рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ред рдпрджрд┐ рдЖрдк SQL рд╕рд░реНрд╡рд░, Oracle, MySQL, рдпрд╛ рдХреБрдЫ рдФрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ DB рдореЗрдВ рдЕрдкреНрд░рдпреБрдХреНрдд рддрд░реНрдХ рд╣реИрдВ, рддреЛ рдЖрдк рдЬреЛрдЦрд┐рдо рдЙрдард╛ рд░рд╣реЗ рд╣реИрдВред рдЕрдиреНрдп рд╕рднреА рдХреЛрдбреЛрдВ рдореЗрдВ рдЕрдиреНрдп рд╕рднреА рдмрдЧреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ, DB рдХреЛрдб рдмрдЧреНрд╕ рдЙрддреНрдкрд╛рдж рдФрд░ рдЗрд╕реЗ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрдВрдкрдиреА рдХреЛ рдиреБрдХрд╕рд╛рди рдкрд╣реБрдВрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рджреВрд╕рд░рд╛: рдЙрдкрдХрд░рдг рд╡рд┐рдХрд▓реНрдкред рдЬреЛ SQL рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, tSQLt, рднрд▓реЗ рд╣реА рдпрд╣ 100% рд╡рд┐рдЬреЗрддрд╛ рди рд╣реЛ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдзреАрдореА рдЧрддрд┐ рд╕реЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдХреБрдЫ рдореБрджреНрджреЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдпрд╣ рдЕрднреА рднреА рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдврд╛рдВрдЪрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдХрд╛рдо рдХреЛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред