My Programming Notes

Here are Notes.... come from debugging

My Programming Notes

Here are Notes.... come from debugging

۵ مطلب با موضوع «پایگاه داده» ثبت شده است

سه شنبه, ۳ بهمن ۱۳۹۶، ۰۳:۴۸ ب.ظ

فراخوانی پروسیجر به صورت Nested

فرض کنید سه تا پروسیجر با نام های sp1 و sp2 و sp3 داریم. داخل پروسیجر sp2 ، ما پروسیجر اول یعنی sp1 را فراخوانی می کنیم و از داده آن به صورت Insert در یک tempTable استفاده می کنیم.

در پروسیجر سوم یعنی sp3  ، ما پروسیجر دوم sp2  که خود در دلش یک پروسیجر دیگر را فراخوانی کرده است را فراخوانی می کنیم که با خطای :


An INSERT EXEC statement cannot be nested


مواجه می شوید. در واقع شما می خواهید به صورت نستد (Nested) پروسیجر ها را فراخوانی کنید.

برای رفع این خطا و رسیدن به هدف ، لازم است پروسیجر دوم را که خود شامل یک پروسیجر دیگر نیز می باشد در یک  table_value Function فراخوانی کنید و داده را در یک table بریزد و حالا در پروسیجر سوم  فانکشن را فراخوانی کنید.

می توانید در پروسیجر سوم از table ارسالی این فانکشن استفاده کنید.


مطالعه بیشتر :   اینجا




۰ نظر موافقین ۱ مخالفین ۰ ۰۳ بهمن ۹۶ ، ۱۵:۴۸
سارا زکی زاده
شنبه, ۱۰ تیر ۱۳۹۶، ۱۲:۲۷ ب.ظ

اطلاعات ستون های جداول پایگاه داده

برای مستند سازی از قسمتی از پروژه ای که روش کار می کنم نیاز داشتم تمام اطلاعات ستون های جداول رو بهتر بشناسم . برای این کار از INFORMATION_SCHEMA.COLUMNS  استفاده کردم :


INFORMATION_SCHEMA.COLUMNS یک VIEW است که قابلیت نمایش اطلاعات تمام ستون های تمام جداول و View های موجود در جداول را داراست.




Column name

Data type

Description

TABLE_CATALOG

nvarchar(128)

Table qualifier.

TABLE_SCHEMA

nvarchar(128)

Name of schema that contains the table.

TABLE_NAME

nvarchar(128)

Table name.

COLUMN_NAME

nvarchar(128)

Column name.

ORDINAL_POSITION

int

Column identification number.

Note: In SQL Server 2005, these column IDs are consecutive numbers.

COLUMN_DEFAULT

nvarchar(4000)

Default value of the column.

IS_NULLABLE

varchar(3)

Nullability of the column. If this column allows for NULL, this column returns YES. Otherwise, NO is returned.

DATA_TYPE

nvarchar(128)

System-supplied data type.

CHARACTER_MAXIMUM_LENGTH

int

Maximum length, in characters, for binary data, character data, or text and image data.

-1 for xml and large-value type data. Otherwise, NULL is returned. For more information, see Data Types (Transact-SQL).

CHARACTER_OCTET_LENGTH

int

Maximum length, in bytes, for binary data, character data, or text and image data.

-1 for xml and large-value type data. Otherwise, NULL is returned.

NUMERIC_PRECISION

tinyint

Precision of approximate numeric data, exact numeric data, integer data, or monetary data. Otherwise, NULL is returned.

NUMERIC_PRECISION_RADIX

smallint

Precision radix of approximate numeric data, exact numeric data, integer data, or monetary data. Otherwise, NULL is returned.

NUMERIC_SCALE

int

Scale of approximate numeric data, exact numeric data, integer data, or monetary data. Otherwise, NULL is returned.

DATETIME_PRECISION

smallint

Subtype code for datetime and SQL-92 interval data types. For other data types, NULL is returned.

CHARACTER_SET_CATALOG

nvarchar(128)

Returns master. This indicates the database in which the character set is located, if the column is character data or text data type. Otherwise, NULL is returned.

CHARACTER_SET_SCHEMA

nvarchar(128)

Always returns NULL.




در تصاویر زیر حاصل اجرای کوئری مربوطه در پایگاه داده AdventureWorks را مشاهده می کنید:


 SELECT * FROM INFORMATION_SCHEMA.COLUMNS



183_in1




183_in2




183_in3



183_in4





183_in5


اگر می خواهید فقط اطلاعات یک جدول را ببینید :
  
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Address'

موفق باشید.


تلگرام : https://t.me/GCC_co

اینستاگرام:  https://www.instagram.com/golden.cube.computing



۰ نظر موافقین ۱ مخالفین ۰ ۱۰ تیر ۹۶ ، ۱۲:۲۷
سارا زکی زاده
دوشنبه, ۱۸ اسفند ۱۳۹۳، ۱۰:۴۴ ب.ظ

تولید یک کاراکتر تصادفی از بین یک گروه کاراکتر

دیروز در بخشی از کارم باید یک رشته 6 کاراکتری که هر کاراکترش طبق فرمول خاصی انتخاب میشه را در sql تولید می کردم.
در بخشی از این رشته یک کاراکتر باید از بین یک گروه کاراکتر متوالی به صورت تصادفی انتخاب شود.
مثلا :
اگر StudentType برابر 5 بود به صورت تصادفی یک کاراکتر از بین کاراکترهای (B,C,D,E,F) را انتخاب کند.
در Sql Server  تابع ()Rand یک عدد تصادفی بین 0 تا 1 را تولید می کنید.
حالا سوال اینجاست که چگونه یک مقدار کاراکتری بین دو کاراکتر مشخص را پیدا کنیم.
همان طور که می دانیم هر کاراکتر داری یک کد اسکی خاص است پس با استفاده از تابع ()Ascii  می توانیم به مقدار اسکی کاراکتر ها دست پیدا کنیم.
حالا باید برای تولید یک عدد رندم حد فاصل دو عدد مشخص چه روالی را طی کنیم؟؟

برای این کار باید یک مقدار Upper و یک مقدار Lower داشته باشیم که محدوده ما را مشخص می کند: 


 DECLARE @GoalNo INT
            DECLARE @Upper INT
            DECLARE @Lower INT
  SELECT @GoalNo= ROUND(((@Upper - @Lower -1) * Rand() + @Lower

 عبارت   ROUND(((@Upper - @Lower -1) * Rand() + @Lower یک مقدار رندم را بین دو عدد مشخص می کند.
ولی هنوز کار تمام نشده است.
من باید عبارت بالا را در یک function قرار می دادم. والبته مقدار GoalNo@  یک مقدار int است ولی من یک کاراکتر می خواستم!

برای اینکه مثدار کاراکتری یک عدد را داشته باشیم از تابع ()Char برای تبدیل کردن استفاده می کنیم.
ولی اگر همین دستور را وارد تابع کنید با خطا مواجه می شود:

Invalid use of a side-effecting operator 'rand' within a function.

 برای رفع این خطا مجبور شدم یک View بسازم و در این View تابع Rand را صدا کنم  . و از این View در function  استفاده کنم:


***** View ***** 
CREATE VIEW Get_RAND
AS
SELECT RAND() AS MyRAND
GO

***** Function *****

CREATE FUNCTION [dbo].MYFunction
)
StudentType int@
  (
(RETURNS varchar(7
AS
BEGIN
   ( DECLARE @Code nvarchar(20
    
            (DECLARE @RandChar varchar(10
            DECLARE @Upper INT
            DECLARE @Lower INT
  
           ( IF (@StudentType = '19'
                BEGIN
                  (' SET @Upper = Ascii('A 
                   (' SET @Lower =  Ascii('M
                END    
            ELSE
                    IF (@StudentType = '29')
                        BEGIN
                           (' SET @Upper = Ascii('N
                            ('SET @Lower =  Ascii('P
                        END
                    
                    ELSE
                       (' IF (@StudentType = '30
                            BEGIN
                              (' SET @Upper = Ascii('Q
                               (' SET @Lower =  Ascii('R
                            END
                    
                              
        DECLARE @Rand int
       ( set @Rand = (SELECT MyRAND FROM dbo.Get_RAND
          SELECT @RandChar = CHAR(ROUND(((@Upper - @Lower -1)*@Rand +
 ((Lower),0@
  '  SELECT  @Code = 'SZ' + @RandChar + 'programmer
    RETURN @Code
END

اگر به کد بالا دقت کنید من View را صدا زدم و مقدارش را در یک متغیر ریختم.
و بعد تونستم از این مقدار در فرمولم استفاده کنم.
فرمول مقدار عددی بر می گرداند پس برای تبدیل کردن آن به مقدار کاراکتری از تابع ()Char استفاده کردم.
و در آخر هم تونستم اون رشته را تولید کنم.

موفق باشید.

۰ نظر موافقین ۲ مخالفین ۰ ۱۸ اسفند ۹۳ ، ۲۲:۴۴
سارا زکی زاده
سه شنبه, ۱۴ بهمن ۱۳۹۳، ۱۱:۵۶ ب.ظ

چگونه یک COPY از یک رکورد یک جدول تهیه کنیم؟

شاید برای شما هم پیش اومده باشه که لازم داشته باشید یک رکورد از داده های موجود در یک جدول را به جدول دیگری منتقل کنید و حتی روی ستون هاش تغیراتی رو اعمال کنید.

داده های موجود در بعضی ستون های یک جدول را به جدول دیگری منتقل کنید و یا کارهایی از این دست.

برای این کار باید یک select مناسب روی داده هایی از جدولتون که نیاز دارید بزنید .

در مرجله بعد این داده ها را در جدول جدیدتون Insert کنید.

به کد زیر دقت کنید :


insert into NewTable(field1, field2, id_backup)
    select field1, field2, uniqueId from PreTable where uniqueId = @Id;


برای اینکه بتوانید همون داده ها را با تعییراتی وارد همون جدول خودش کنید و تغییراتی روی داده ها اعمال کنید مثل تغییر ID و یا هر چیز جدید می تونید از روش زیر استفاده کنید :


declare @newguid uniqueidentifier
select * Into TempTable from MyTable where id=@ID
set @newguid = NEWID(),Title='newtitle' 
update TempTableset ID = @newguid
insert into MyTable select * from TempTable drop table TempTable


امیدوارم این نکته مفید بوده باشه.

موفق باشید.

جهت مطالعه بیشتر مراجعه شود به :

 How to Clone an SQL Record


 ** با تشکر از راهنمایی های همکار گرامی ام جناب آقای مهندس خانلری

۰ نظر موافقین ۱ مخالفین ۰ ۱۴ بهمن ۹۳ ، ۲۳:۵۶
سارا زکی زاده
چهارشنبه, ۲ مهر ۱۳۹۳، ۰۷:۰۹ ب.ظ

ًُُSQL Injection یا تزریق SQL

سر کلاس بودیم و استاد داشتند از عامل ارتباط بین لایه های مختلف نرم افزار – Data Access Layer – می گفتند.

در یک مثال ساده یک فرم لاگین (Log In) درست کردیم . در پایگاه داده هم چند یوزر با اطلاعات کامل ازشون داشتیم.

در تست اولیه با یک دید کاملا مثبت به همه چیز و همه کس یک  Username و Password معتبر را وارد کردیم و عملیات لاگین انجام شد.

در دفعه دوم یک  Username و Password غیر معتبر وارد کردیم و پیغام متناسب با آن نمایش داده شد.

موارد بالا هر کدام در بهترین حالت می تواند اتفاق بیفتد ولی همان طور که موقع طراحی نرم افزار مخصوصا قسمت UserInterface آن باید پایین ترین میزان علم و آگاهی و آشنایی کاربر را نسبت به نرم افزار در نظر بگیریم ، برای ریزه کاری های امنیتی هم باید بالاترین میزان هوش را برای کاربر و بالاخص افراد سودجو در نظر گرفت.*

یکی از حالت های بدی که ممکن است در وارد کردن اطلاعات چنین فرم اتفاق بیفتد یک روش هک است به نام SQL Injection  که در لغت به معنی تزریق کد SQL است.

 

 SQL Injection   یعنی :

هک برنامه از طریق وارد کردن دستورات مخرب T- SQL و وارد کردن آسیب جدی به ساختار برنامه.

        

 

۱ نظر موافقین ۴ مخالفین ۰ ۰۲ مهر ۹۳ ، ۱۹:۰۹
سارا زکی زاده