home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Internet Business Development Kit / PRODUCT_CD.iso / sqlsvr / i386 / instsupl.sql < prev    next >
Encoding:
Text File  |  1995-12-01  |  6.6 KB  |  310 lines

  1.  
  2. /*
  3. ** InstSupl.SQL         1995/11/30 14:25
  4. */
  5.  
  6. Go
  7. use master
  8. set nocount on
  9. Go
  10.  
  11. /*
  12. ** Allow ad-hoc updates on system tables
  13. */
  14. sp_configure 'allow updates',1
  15. Go
  16. reconfigure with override
  17. Go
  18. raiserror('reconfigure- was just run.',1,1)
  19.  
  20. raiserror('Dropping to-be-created procs if they already exist....',1,1)
  21.  
  22. if exists (select * from sysobjects
  23.     where name = 'sp_marksuspect' and sysstat = 4)
  24.    drop procedure sp_marksuspect
  25.  
  26. if exists (select * from sysobjects
  27.     where name = 'sp_diskblock' and sysstat = 4)
  28.    drop procedure sp_diskblock
  29.  
  30. if exists (select * from sysobjects
  31.     where name = 'sp_resetstatus' and sysstat = 4)
  32.    drop procedure sp_resetstatus
  33. Go
  34.  
  35.  
  36. raiserror('Creating proc sp_diskblock.',1,1)
  37. Go
  38.  
  39. CREATE PROC sp_diskblock @disk int, @block int AS
  40. DECLARE @low    int,
  41.         @dname  varchar(30),
  42.         @msg    varchar(90),
  43.         @lpage  int,
  44.         @dbid   int,
  45.         @segmap int
  46.  
  47. SELECT  @low = low,  @dname = name
  48.     FROM master.dbo.sysdevices WHERE low/16777216 = @disk
  49.  
  50. IF ( @low IS NULL )
  51.     BEGIN
  52.         SELECT @msg = 'Virtual device ' + CONVERT(varchar, @disk)
  53.          + ' does not exist on this server.'
  54.         PRINT @msg
  55.         RETURN (1)
  56.     END
  57. ELSE
  58.     BEGIN
  59.         SELECT  @lpage = lstart + @block + @low - vstart,
  60.             @dbid = dbid, @segmap = segmap
  61.             FROM master.dbo.sysusages WHERE (@block + @low) >= vstart
  62.             AND (@block + @low) <= (vstart + size)
  63.         IF ( @dbid IS NULL )
  64.             BEGIN
  65.                 SELECT @msg = 'Block ' + CONVERT(varchar, @block)
  66.                     +' on disk "' + @dname
  67.                     + '" is currently not in use for any database.'
  68.                 PRINT @msg
  69.                 RETURN (1)
  70.             END
  71.         ELSE
  72.             BEGIN
  73.                 SELECT @msg = "Virtual disk " + convert(varchar,@disk)
  74.                     + ", block " + convert(varchar,@block)
  75.                     + " corresponds to:"
  76.                 PRINT @msg
  77.                 SELECT @msg ='Logical page ' + convert(varchar,@lpage)
  78.                     + ' in the "'  + DB_NAME(@dbid)
  79.                     + '" database (dbid='  + convert(varchar(3),@dbid)
  80.                     + ') on device "' + @dname + '".'
  81.                 PRINT @msg
  82.             END
  83.     END
  84. RETURN (0)
  85.  
  86. Go
  87.  
  88.  
  89. raiserror('Creating proc sp_resetstatus.',1,1)
  90. Go
  91.  
  92. CREATE PROCEDURE sp_resetstatus  -- 1995/11/30 14:12 #12092
  93.        @DBName          varchar(30)
  94. as
  95.  
  96. Set nocount on
  97.  
  98. Declare
  99.        @msg             varchar(80)
  100.       ,@RetCode         integer
  101.       ,@_error          integer
  102.       ,@_rowcount       integer
  103.       ,@int1            integer
  104.       ,@bitSuspect      integer
  105.       ,@mode            integer
  106.       ,@status          integer
  107.  
  108. Select
  109.        @RetCode         = 0  -- 0=no_problem, 1=some_problem
  110.  
  111. ---------------------  Restrict to SA  -------------------------
  112.  
  113. IF suser_id() <> 1
  114.    begin
  115.    RaisError(15003,-1,-1)
  116.    Select @RetCode = 1
  117.    GOTO LABEL_86BYEBYE
  118.    end
  119.  
  120.  
  121. ------------------  Get SuspectBit id value  ------------------
  122.  
  123. SELECT       @bitSuspect = min(number)
  124.       from
  125.              master..spt_values
  126.       where  type = 'D  '
  127.       and    name = 'not recovered'  -- 256, Suspect
  128.  
  129. IF (@bitSuspect IS Null)
  130.    begin
  131.  
  132.    RaisError('
  133. Surprisingly a Suspect bit value could not be Selected from spt_values,
  134. thus using hardcoded value of 256.
  135. ',13,1)
  136.  
  137.    Select
  138.        @bitSuspect      = 256
  139.    end
  140.  
  141.  
  142. ----------------------  Forbid active txn  ---------------------
  143.  
  144. --- (Prior spt_values Sel trips SET implicit_transactions!)
  145.  
  146.  
  147. IF @@trancount > 0
  148.    begin
  149.    RaisError(15002,-1,-1,'sp_resetstatus')
  150.    Select @RetCode = 1
  151.    GOTO LABEL_86BYEBYE
  152.    end
  153.  
  154.  
  155. ---------------  Obtain/Report pre-Update values  --------------------
  156.  
  157. SELECT
  158.              @mode   = min(mode)
  159.             ,@status = min(status)
  160.       from
  161.              master..sysdatabases
  162.       where  name = @DBName
  163.  
  164. IF @@error <> 0 OR @status IS Null
  165.    begin
  166.    RaisError('
  167. No row could be Selected from sysdatabases for DBName=''%s''!
  168. ',1,1,@DBName)
  169.    Select @RetCode = 1
  170.    GOTO LABEL_86BYEBYE
  171.    end
  172.  
  173.  
  174. Select @int1 = @status & @bitSuspect
  175.  
  176. Raiserror('
  177. Prior to Update sysdatabases attempt for DBName=''%s'',
  178. the mode=%d and status=%d (status suspect_bit=%d).
  179. ',1,1 ,@DBName ,@mode ,@status ,@int1)
  180.  
  181.  
  182. ---------------------  Update sysdatabases row  ---------------------
  183.  
  184.  
  185. BEGIN TRANSACTION
  186.  
  187.  
  188. UPDATE
  189.              master..sysdatabases
  190.       set
  191.              mode    = 0
  192.             ,status  = status & (~ @bitSuspect)
  193.       where  name    = @DBName
  194.       and
  195.             (mode   <> 0      OR
  196.              status  & @bitSuspect > 0
  197.             )
  198.  
  199. Select @_error = @@error ,@_rowcount = @@rowcount
  200.  
  201.  
  202. IF @_error <> 0
  203.    begin
  204.  
  205.    ROLLBACK TRANSACTION
  206.  
  207.    RaisError('
  208. ERROR!  @@error<>0 from Update sysdatabases.
  209. ',1,1)
  210.    Select @RetCode = 1
  211.    GOTO LABEL_86BYEBYE
  212.    end
  213.  
  214.  
  215. COMMIT TRANSACTION
  216.  
  217. -------- Report the results
  218.  
  219. IF @_rowcount = 0
  220.    begin
  221.    Raiserror('
  222. No sysdatabases row was Updated,
  223. because mode and status are already reset to fine.  No error, no changes made.
  224. ',1,1)
  225.    end
  226.  
  227. ELSE
  228.    begin
  229.  
  230.    Raiserror('
  231. For DBName=''%s'' in sysdatabases,
  232. status bit %d was forced Off and mode was forced to 0.'
  233. ,1,1, @DBName,@bitSuspect)
  234.  
  235.    Raiserror('
  236. WARNING:  You MUST stop/restart SQL Server prior to accessing this database!
  237. ',1,1)
  238.  
  239.    end
  240.  
  241.  
  242. LABEL_86BYEBYE:
  243.  
  244. RETURN @RetCode
  245.  
  246. Go
  247.  
  248.  
  249. raiserror('Creating proc sp_marksuspect.',1,1)
  250. Go
  251.  
  252. CREATE PROC sp_marksuspect @dbname varchar(30) AS
  253.     DECLARE @msg     varchar(80)
  254.     IF @@trancount > 0
  255.         BEGIN
  256.             PRINT "Can't run sp_marksuspect from within a transaction."
  257.             RETURN (1)
  258.         END
  259.     IF suser_id() != 1
  260.         BEGIN
  261.             SELECT @msg = "You must be the System Administrator (SA) "
  262.             SELECT @msg = @msg + "to execute this procedure."
  263.             PRINT @msg
  264.              RETURN (1)
  265.         END
  266.     IF (SELECT COUNT(*) FROM master..sysdatabases
  267.              WHERE name = @dbname) != 1
  268.          BEGIN
  269.             SELECT @msg = "Database '" + @dbname + "' does not exist!"
  270.             PRINT @msg
  271.             RETURN (1)
  272.         END 
  273. IF (SELECT COUNT(*) FROM master..sysdatabases
  274.                 WHERE name = @dbname and status & 256 = 256) = 1
  275.         BEGIN
  276.                 SELECT @msg = "Database '" + @dbname + "' "
  277.                 SELECT @msg = @msg + "is already marked suspect."
  278.                 PRINT @msg
  279.                 RETURN (1)
  280.         END
  281.     BEGIN TRAN
  282.         update master..sysdatabases set status = status|256
  283.             WHERE name = @dbname
  284.     IF @@error != 0 or @@rowcount != 1         ROLLBACK TRAN
  285.     ELSE
  286.         BEGIN
  287.             COMMIT TRAN
  288.             SELECT @msg = "Database '" + @dbname + "' has been marked "            
  289.     SELECT @msg = @msg + "suspect!"
  290.             PRINT @msg
  291.             PRINT " "
  292.             SELECT @msg = 'WARNING: Next you should drop this database via DBCC REPAIR!'
  293.             PRINT @msg
  294.             PRINT " "
  295.         END
  296.  
  297. Go
  298.  
  299. /*
  300. ** Disallow ad-hoc updates to system tables.
  301. */
  302. sp_configure 'allow updates',0
  303. Go
  304. reconfigure with override
  305. Go
  306. raiserror('reconfigure- was just run.',1,1)
  307. Go
  308. -- -
  309.  
  310.