ورود

View Full Version : آسیب دیدگی بانک اطلاعاتی



Galawij
دوشنبه 22 فروردین 1390, 08:20 صبح
سلام دوستان
روالی نوشتم که نام جدول و فایل xml رو می گیره و عملیات درج را در بانک اطلاعاتی انجام می ده. این روال روی مابقی بانک های اطلاعاتی کار می کنه ولی رو یکی از Database هام جواب نمی ده. پیغامی که می ده، اینه:

Cannot add rows to sys.sql_dependencies for the stored procedure because it depends on the missing table 'SP_EXECUTESQL'. The stored procedure will still be created; however, it cannot be successfully executed until the table exists.

به نظر شما بانک اطلاعاتی من آسیب دیده و اینکه چطوری می تونم رفعش کنم؟

حمیدرضاصادقیان
دوشنبه 22 فروردین 1390, 11:34 صبح
سلام.
همه دیتابیسهای شما روی یک نسخه از SQL Server قرار دارد؟
میتوانید متن Procedure رو بنویسید؟

m_omrani
دوشنبه 22 فروردین 1390, 11:48 صبح
دیتابیستون مشکل نداره و خراب نشده. یکی از جدول هاتون به اسم SP_EXECUTESQL وجود نداره.

پیغامی که داره می ده می گه SP شما نیاز به جدولی به نام SP_EXECUTESQL داره که موجود نیست. SP به هر حال ایجاد شده اما بدون وجود این جدول قطعاً درست کار نخواهد کرد.
اگرچه انتخاب چنین اسمی برای جدول عجیب به نظر میاد، اما چون به هر حال SQL Server داره می گه چنین جدولی می بایست وجود داشته باشه که وجود نداره، یعنی حتماً یه جایی توی SP تون از چنین جدولی استفاده کردید. ببینید چرا این جدول وجود نداره.

Galawij
دوشنبه 22 فروردین 1390, 11:50 صبح
سلام آقای صادقیان
بله همه روی نسخه sql server 2005 قرار دادند.
کد روال :

USE [SMB]
GO
/****** Object: StoredProcedure [dbo].[SPCentralInsert] Script Date: 04/11/2011 12:16:55 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SPCentralInsert]
@TableName nvarchar(100),
@IdColumeXml XML
AS
BEGIN
declare @SqlColume nvarchar(MAX)
declare @SqlValue nvarchar(MAX)
declare @SqlInsert nvarchar(MAX)
declare @CountColume int
declare @id SMALLINT
SET @SqlColume=''
SET @SqlValue=''
SET @id=1
SET @CountColume=1
SET @CountColume=convert(int,Convert(nvarchar(MAX),@Id ColumeXml.query('count(TableName/Colume/ColumeName)')))
While(@CountColume>0)
BEGIN
SET @SqlColume= @SqlColume + Convert(nvarchar(MAX),@IdColumeXml.query('data(/TableName/Colume[@Id=sql:variable("@Id")]/ColumeName)')) + ','
SET @SqlValue= @SqlValue + '''' + Convert(nvarchar(MAX),@IdColumeXml.query('data(/TableName/Colume[@Id=sql:variable("@Id")]/ColumeValue)')) + '''' + ','
SET @CountColume=@CountColume-1
SET @id=@id+1
END
SET @SqlInsert='INSERT INTO ' + @TableName + '(' + left(@SqlColume,len(@SqlColume)-1) + ') VALUES' + '(' + left(@SqlValue,len(@SqlValue)-1) + ')'
EXECUTE SP_EXECUTESQL @SqlInsert
END

البته من خط آخر را به این صورت تغییر دادم ، ظاهراً مشکل حل شد.


EXEC (@SqlInsert)

Galawij
دوشنبه 22 فروردین 1390, 11:53 صبح
دیتابیستون مشکل نداره و خراب نشده. یکی از جدول هاتون به اسم SP_EXECUTESQL وجود نداره.

دوست من این نام جدول نیست یکی از روال های سیستمی Sql هست که من فراخوانی می کنم.

m_omrani
دوشنبه 22 فروردین 1390, 12:55 عصر
بله. من هم با این روال آشنا هستم. تعجب من هم از این بود که چرا چنین اسمی برای یک جدول انتخاب کرده اید.
عرض کردم بر اساس پیغامی که SQL Server موقع ایجاد اون SP بهتون داده، می گه باید چنین جدولی موجود باشه اما نیست.
به همین دلیل گفتم سورس SP تون رو چک کنید. شاید جاییش اشتباه تایپی ای چیزی داشته باشید.

m_omrani
دوشنبه 22 فروردین 1390, 13:03 عصر
من سورس SP تون رو چک کردم. ظاهراً مشکلی نداره. شاید اشکال از دیتاییه که در پارامتر @TableName بهش پاس میدید. مثلاً ممکنه توی سورس برنامه تون جایی که دارید این SP فراخوانی می کنید، به جای نام جدول، رشته ی "SP_EXECUTESQL" رو بهش پاس بدید؟

Galawij
دوشنبه 22 فروردین 1390, 13:44 عصر
از توجه تون ممنونم
نه مشکل از ارسال پارامتر نیست. مشکل از این روال داخلی Sql هست که با حذف این فراخوانی مشکل حل شد.
مرســی.