You are here: Re: SPROC won't execute - insufficient permissions « MsSQL Server « IT news, forums, messages
Re: SPROC won't execute - insufficient permissions

Posted by Dan Guzman on 06/30/06 11:28

> How do I give the SPROC permission to execute?

Since DBCC OUTPUTBUFFER can only be executed by sysadmin role members, you
must be a sysadmin to use this technique to get the error message. I
believe you will find this disclaimer in Erland's article.

SQL 2005 has structured error handling that allows you can get error details
in a CATCH block without the kludge.

--
Hope this helps.

Dan Guzman
SQL Server MVP

<teddysnips@hotmail.com> wrote in message
news:1151658530.478948.38290@x69g2000cwx.googlegroups.com...
> I'm trying to use the SPROC below (courtesy of Erland!) to capture the
> error message but it fails owing to insufficient permissions (I can't
> reproduce it just now, but I think it's because it can't get access to
> the DBCC OUTPUTBUFFER).
>
> How do I give the SPROC permission to execute?
>
> Many thanks
>
> Edward
>
>
> CREATE PROCEDURE stpShowErrorMessage @errmsg nvarchar(500) OUTPUT AS
> DECLARE @dbccrow nchar(77),
> @msglen int,
> @lenstr nchar(2),
> @sql nvarchar(2000),
> @s tinyint
>
> -- Catch the output buffer.
> CREATE TABLE #DBCCOUT (col1 nchar(77) NOT NULL)
> INSERT INTO #DBCCOUT
> EXEC ('DBCC OUTPUTBUFFER(@@spid)')
>
> -- Set up a cursor over the table. We skip the first
> -- row, because there is nothing of interest.
> DECLARE error_cursor CURSOR STATIC FORWARD_ONLY FOR
> SELECT col1
> FROM #DBCCOUT
> WHERE left(col1, 8) <> replicate('0', 8)
> ORDER BY col1
>
> -- Init variable, and open cursor.
> SELECT @errmsg = ''
> OPEN error_cursor
> FETCH NEXT FROM error_cursor INTO @dbccrow
>
> -- On this first row we find the length.
> SELECT @lenstr = substring(@dbccrow, 15, 2)
>
> -- Convert hexstring to int
> SELECT @sql = 'SELECT @int = convert(int, 0x00' + @lenstr + ')'
> EXEC sp_executesql @sql, N'@int int OUTPUT', @msglen OUTPUT
>
> -- @s is where the text part of the buffer starts.
> SELECT @s = 62
>
> -- Now assemble rest of string.
> WHILE @@FETCH_STATUS = 0 AND datalength(@errmsg) - 1 < 2 * @msglen
> BEGIN
> SELECT @errmsg = @errmsg + substring(@dbccrow, @s + 1, 1) +
> substring(@dbccrow, @s + 3, 1) +
> substring(@dbccrow, @s + 5, 1) +
> substring(@dbccrow, @s + 7, 1) +
> substring(@dbccrow, @s + 9, 1) +
> substring(@dbccrow, @s + 11, 1) +
> substring(@dbccrow, @s + 13, 1) +
> substring(@dbccrow, @s + 15, 1)
> FETCH NEXT FROM error_cursor INTO @dbccrow
> END
>
> CLOSE error_cursor
> DEALLOCATE error_cursor
>
> -- Now chop first character which is the length, and cut after end.
> SELECT @errmsg = substring(@errmsg, 2, @msglen)
> GO
>

 

Navigation:

[Reply to this message]


Удаленная работа для программистов  •  Как заработать на Google AdSense  •  England, UK  •  статьи на английском  •  PHP MySQL CMS Apache Oscommerce  •  Online Business Knowledge Base  •  DVD MP3 AVI MP4 players codecs conversion help
Home  •  Search  •  Site Map  •  Set as Homepage  •  Add to Favourites

Copyright © 2005-2006 Powered by Custom PHP Programming

Сайт изготовлен в Студии Валентина Петручека
изготовление и поддержка веб-сайтов, разработка программного обеспечения, поисковая оптимизация