【问题标题】:Want an idea in writing a code section在编写代码部分时想要一个想法
【发布时间】:2023-03-03 18:34:01
【问题描述】:

场景: 我正在用 C# 创建一个管理工具,它将在服务器中恢复完整的 sql server 备份并应用事务日志。 db上来后。我已经运行了一些如下所示的脚本。

use master
EXEC sp_addlogin '<destsid>', '<sidadmpass>','<dbname>'
use <dbname>
EXEC sp_grantdbaccess '<destsid>'
EXEC sp_addrolemember 'db_owner', '<destsid>'
EXEC sp_change_users_login 'Update_One','<destsid>','<destsid>'
use master
EXEC sp_grantdbaccess '<destsid>'
EXEC sp_addrolemember 'db_owner', '<destsid>'
use msdb
EXEC sp_grantdbaccess '<destsid>'
EXEC     sp_addrolemember 'db_owner', '<destsid>'
use model
EXEC sp_grantdbaccess '<destsid>'
EXEC sp_addrolemember 'db_owner', '<destsid>'
use tempdb
EXEC sp_grantdbaccess '<destsid>'
EXEC sp_addrolemember 'db_owner', '<destsid>'
use master
grant all on xp_cmdshell to <destsid>
EXEC sp_addsrvrolemember '<destsid>', 'serveradmin'
EXEC sp_addsrvrolemember '<destsid>', 'dbcreator'
EXEC sp_addsrvrolemember '<destsid>', 'bulkadmin'
use <dbname>
if object_id('sp_change_sapuser') is not null
    drop procedure sp_change_sapuser 
create procedure sp_change_sapuser @oldid sysname, @newid sysname
as begin
declare @oldid_uid  smallint
declare @newid_uid  smallint    
declare @object     sysname
declare @object_full    nvarchar(999)
set @oldid_uid = user_id(@oldid)
set @newid_uid = user_id(@newid)
if @oldid_uid is not null and @newid_uid is not null
begin
declare object_cursor cursor local for 
select name from sysobjects where((xtype='U' and name <> 'dtproperties') or (xtype='V' and name not in ('syssegments','sysconstraints')) or (xtype='P' and name not like 'dt_%') or (xtype='D' and name not like 'DF__dtpropert%') or (xtype in ('FN','TF','IF'))) and @oldid_uid = uid
open object_cursor
fetch next from object_cursor into @object
while @@fetch_status=0
begin
set @object_full = user_name(@oldid_uid) + '.' + @object
exec sp_changeobjectowner @object_full, @newid
fetch next from object_cursor into @object
end
end
else
if @oldid_uid is null
begin
print '*** old database user does not exist ***'
end
if @newid_uid is null
begin
print '*** new database user does not exist ***'
end
end
exec sp_change_sapuser '<sourcesid>', '<destsid>'
use master
EXEC sp_grantlogin   'AMR\<destsid>adm'
EXEC sp_grantlogin   'AMR\SAPService<dbname>'
EXEC sp_defaultdb    'AMR\<destsid>adm','<dbname>'
EXEC sp_defaultdb    'AMR\SAPService<dbname>','<dbname>'
EXEC sp_addsrvrolemember 'AMR\<destsid>adm',     'sysadmin'
EXEC sp_addsrvrolemember 'AMR\SAPService<dbname>', 'sysadmin'
EXEC xp_sqlagent_proxy_account 'SET', '<servername>', 'SAPMssXPUser',N'<sidadmpass>'
use master
EXEC sp_addlogin '<destsid>', '<sidadmpass>', <dbname>
use <dbname>
EXEC sp_change_users_login 'Update_One','<destsid>','<destsid>'
EXEC sp_grantdbaccess '<destsid>'
EXEC sp_addrolemember 'db_owner', '<destsid>'
use master
EXEC sp_grantdbaccess '<destsid>'
EXEC sp_addrolemember 'db_owner', '<destsid>'
use msdb
EXEC sp_grantdbaccess '<destsid>'
EXEC sp_addrolemember 'db_owner', '<destsid>'
use model
EXEC sp_grantdbaccess '<destsid>'
EXEC sp_addrolemember 'db_owner', '<destsid>'
use tempdb
EXEC sp_grantdbaccess '<destsid>'
EXEC sp_addrolemember 'db_owner', '<destsid>'
use master
grant all on xp_cmdshell to <destsid>
EXEC sp_addsrvrolemember '<destsid>', 'serveradmin'
EXEC sp_addsrvrolemember '<destsid>', 'dbcreator'
EXEC sp_addsrvrolemember '<destsid>', 'bulkadmin'
--EXEC xp_sqlagent_proxy_account 'SET', '<servername>', 'SAPMssXPUser', N'<sidadmpass>'
EXEC sp_grantlogin   '<destsid>adm'
EXEC sp_grantlogin   'SAPService<dbname>'
EXEC sp_defaultdb    '<destsid>adm','<dbname>'
EXEC sp_defaultdb    'SAPService<dbname>','<dbname>'
EXEC sp_addsrvrolemember '<destsid>adm',     'sysadmin'
EXEC sp_addsrvrolemember 'SAPService<dbname>', 'sysadmin'

注意:给出的值将替换为实际值。

在运行这些脚本时,很少有人会抛出异常。但即使某些脚本抛出错误,我也想继续。而且我还删除了 GO(batch terminator),因为我无法将单独的 dll 添加到服务器中。请提出一些想法来解决这个问题。

详情: 编程语言:C# 数据库 - Sql Server 2005,08

【问题讨论】:

    标签: c# sql-server database sql-server-2008 database-administration


    【解决方案1】:

    您不能错过GOs。对于某些语句(例如CREATE PROCEDURE),重要的是它们存在于自己的单独批次中。

    GO 是对客户端工具(例如 SSMS)的指令,它应该将前面的文本(返回到前面的 GO 或脚本的开头,以较晚者为准)作为批处理发送到服务器。因此,如果您通过代码向服务器发送 SQL,您应该做同样的事情 - 或者将每个批次存储为单独的文本片段,这样您就不必担心解析文本(考虑多行字符串可能包含单词 GO 的文字)。

    对于每个批次(最初由原始脚本中的 GOs 分隔),您需要通过调用 ExecuteNonQuery 或类似方法将其作为单独的批次发送到服务器 - 然后创建一个新的 SqlCommand 对象(或用要执行的下一批替换现有文本的文本。

    然后您可能会决定处理来自 C# 代码中 SQL 执行的任何错误,然后转而设置下一批并执行它。

    【讨论】:

    • 嘿,我明白了。谢谢。还有一个疑问。如果分批中包含“use db”,是否也需要使用 go 那里。
    • @Yes-kaY - 我通常会 - 或者如果您正在处理单独的数据库,也许可以使用适当的连接字符串创建单独的 SqlConnection 对象。
    • @ Damien_The_Unbeliever - 谢谢老兄。非常需要。再次感谢。
    • 嘿,我有另一个请求,想使用 C# 代码检查用户是否在 db 中。你能帮帮我吗?
    【解决方案2】:

    将每个“部分”包装到它自己的 Try/Catch Block 中,您的脚本应该能够克服任何错误。如果遇到错误,脚本将直接跳转到下一个“节”。

    另外,根据MSDN: GO (Transact-SQL)

    GO 不是 Transact-SQL 语句;它是 sqlcmd 和 osql 实用程序以及 SQL Server Management Studio 代码编辑器识别的命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 2022-06-17
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多