我知道如何使用 PowerShell 和 SMO 编写存储过程脚本:
[System.reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | out-null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | out-null
$srv = New-Object "Microsoft.SqlServer.Management.Smo.Server"
$srv.databases['MyDatabase'].StoredProcedures['MyProc'].TextBody
Run Code Online (Sandbox Code Playgroud)
但由于我想在查询中使用过程文本,我想知道是否可以在纯 T-SQL 中以某种方式调用 SMO。
只能在开发环境中运行。
顺便说一句:返回具有给定名称的存储过程定义的函数可以解决我当前的问题,但不能回答我的问题。
编辑:
当我使用这个查询时,我想找到哪些过程引用了给定的表:
SELECT p.name --, definition
FROM sys.sql_modules m
join sys.objects p on m.object_id = p.object_id
where p.type = 'P'
and definition like '%SearchForThis%'
Run Code Online (Sandbox Code Playgroud)
这与我想使用 SMO 获得的信息完全相同。
sql-server-2008 stored-procedures scripting sql-clr ole-automation
对于 SQL Server 2012 及更高版本,如SQL Server 安装中的新增功能所述:
BUILTIN\administrators和本地系统( NT AUTHORITY\SYSTEM ) 不会在 sysadmin 固定服务器角色中自动配置。
就我而言,这已经成为一个问题:我有一个 WiX 安装程序,它使用Custom ActionC++ 代码来设置数据库数据(创建数据库、视图、过程、数据等)。Custom Action以 user 身份运行NT AUTHORITY\SYSTEM,但此帐户没有执行CREATE DATABASE脚本的权限。
安装软件时赋予sysadmin角色是否正确NT AUTHORITY\SYSTEM?或者也许有更好的解决方案?
如果正确,是否可以找到正确的用户名NT AUTHORITY\SYSTEM?我需要这个名字才能更改权限*。在不同的语言环境中,此名称是不同的,例如,NT AUTHORITY\SYSTEM或NT AUTHORITY\???????。
添加NT AUTHORITY\SYSTEM到sysadmin角色:
IF NOT EXISTS
(
SELECT name
FROM master.sys.server_principals
WHERE IS_SRVROLEMEMBER ('sysadmin', name) = 1
AND name LIKE 'NT AUTHORITY\SYSTEM'
)
EXEC …Run Code Online (Sandbox Code Playgroud) 将我们的数据库从 SQL Server 2012 迁移到 2016,我们无法重新创建涉及用 VBScript 编写的 ActiveX 脚本步骤的 SQL 代理作业。
错误消息表明这'ACTIVESCRIPTING'不是 的@subsystem参数的允许值sp_add_jobstep。
我知道 ActiveX 脚本被标记为“将在SQL Server的未来版本中删除”。但是,我看不到在此版本的 SQL Server 中实际删除了有关它的任何内容。
SQL Server 文档似乎表明它在 SQL Server 2016 中仍然可用:
sp_add_jobstep2017 年 3 月更新的文档仍@subsystem ='ACTIVESCRIPTING'列为可用。在@subsystem ='ACTIVESCRIPTING'事实上,在一个未公开的方式偷偷取走,还是我们错过了一个可安装组件,支持呢?
我正在尝试在 Server 2012R2 上使用 DOS 命令提示符来运行包含以下内容的批处理。我想运行一个 SQL 命令 (sqlcmd) 并将结果返回到命令窗口。
这就是我目前正在尝试的,但 sqlcmd 不断抛出Sqlcmd: 'test': Invalid argument. Enter '-?' for help.20:56:08.
FOR /F "tokens=* USEBACKQ" %%F IN (`sqlcmd -S localhost -E -i "backup.sql" -v dbname="test"`) DO (
Echo %%F
)
Run Code Online (Sandbox Code Playgroud)
但是,如果我在没有参数/变量的情况下尝试它,它会完美运行!
FOR /F "tokens=* USEBACKQ" %%F IN (`sqlcmd -S localhost -E -i "backup.sql"`) DO (
Echo %%F
)
Run Code Online (Sandbox Code Playgroud)
有没有人知道使用 sqlcmd、DOS CMD 以及 FOR /F 循环(例如在我的第一个示例中)将变量传递给我的 sql 查询的方法?
我目前正在进行 SQL Server 迁移(从 SQL Server 2005 到 2008 R2 服务器,在新的物理服务器上)。
数据库本身将使用数据库备份和恢复脚本进行传输。我已经测试过了,它工作正常,没有问题。
我担心的是所有其他实例/系统对象,例如登录、SQL 代理作业。这些已从源服务器编写并重新应用到新服务器上,恐怕我已经忘记了一些。我可以明显地直观地比较使用SQL Management Studio,这就是我所做的,但它既耗时又容易出错。因此,在及时拔掉现有服务器的插头之前,我更希望有一种更“科学”的方法来确认一切都在那里......
我一直在寻找进行这种比较的软件,但只找到了模式或数据比较工具。我想我可以比较 sys.sql_logins 和 msdb.dbo.sysjobs 等系统表,但我不知道它们全部。
简而言之,有没有一种方法可以快速比较两个服务器的实例级对象,如果可能的话,还可以比较它们的内容,而不仅仅是通过名称?
谢谢。
我正在阅读 postgresql 复制解决方案,但是,即使我刚刚开始了解它是如何工作的,另一个疑问也出现了。我将使用 postgres 内部复制解决方案,但据我所知,每个事件都将在实现时复制;例如,如果我将一些数据插入主站,它会自动复制到从站......我对吗?
嗯,是这样吗,我正在寻找将此复制安排为被动备份的方法,但问题是,例如,我需要在每个星期一晚上将数据库与当天插入的所有数据一起复制到Amazon EC2 虚拟服务器中的从数据库。我正在考虑使用 cron 作为第一种方法,但阅读 postgres 文档我意识到实际上只配置必要的文件,postgres 为你做...
那么,我怎样才能在需要的时刻安排复制呢?
PD.-时间表可能会有所不同,因此它需要完全通用,而且...我正在使用 Ubuntu 12.04 和 PostgreSQL 9.1,就像在主从中一样。谢谢
我正在尝试从旧表创建新表结构的更新,但不使用函数。我正在尝试为其创建一个脚本。旧表是这样的:
旧表 ( OldTable)
| 姓名 | 可乐 | 列b | 列_c |
|---|---|---|---|
| ABC | 0 | 无效的 | 1 |
| DEF | 1 | 1 | 1 |
| 生长激素指数 | 无效的 | 1 | 0 |
并且,新表:
Users:
| ID | 姓名 |
|---|---|
| 1 | ABC |
| 2 | DEF |
| 3 | 生长激素指数 |
Rules:
| ID | 规则名称 |
|---|---|
| 1 | 可乐 |
| 2 | 列b |
| 3 | 列_c |
| 4 | 寒冷的 |
UserRule
| ID_USER | ID_规则 |
|---|
因此,我需要使用 TableMix 上的选择结果填充表 UserRules,其中用户名等于表 User 上的用户名,并且 TableMix 中列 <col_name> 的值等于 1。(select <col_name>来自 OldTable,其中 OldTable.name = Users.name)。嗯,我正在尝试这个:
DO $$
DECLARE rules CURSOR FOR SELECT column_name FROM information_schema.columns
WHERE table_schema = 'public' AND table_name = …Run Code Online (Sandbox Code Playgroud) 运行以下查询时:
-- DATEADD (datepart , number , date )
DECLARE @dt DATETIME
SELECT @dt = DATEADD(month,-6,getdate())
select @dt
EXEC msdb.dbo.sp_delete_backuphistory @oldest_date = @dt
Run Code Online (Sandbox Code Playgroud)
我收到很多锁和块,可能是因为该命令已经有一段时间没有运行了(如果有的话)。
在我实际运行或计划运行此命令之前,有没有办法找出每个涉及的表中有多少要删除的内容?
我使用dateadd来计算 6 个月。
在sp_delete_backuphistory中,以下表被修剪:
sp_delete_backuphistory 必须从 msdb 数据库运行并影响以下表:
备份文件
备份文件组
备份媒体家族
备份媒体集
备份集
恢复文件
恢复文件组
恢复历史
每次我需要恢复数据库或重新初始化复制发布时,我首先(在恢复的数据库或订阅数据库上)我编写所有权限、触发器、索引、同义词,有时还编写统计信息
然后我执行还原或(应用快照),然后在还原的数据库上重新应用我保存的脚本。
我有一些 LIVE 服务器,其中db_denydatawriter已被大量使用,尽管我拥有以前的所有权限,但由于db_denydatawriter还原附带(因为它处于活动状态),新还原的数据库现在拥有它。
它会导致问题。
以至于现在我有了这个脚本(使用sp_foreachdb)只是为了在测试中删除它:
declare @db_list NVARCHAR(MAX)
SELECT @db_list = STUFF((
SELECT ', ' + name FROM sys.databases
WHERE name NOT IN ('DBA','TABLEBACKUPS','MASTER','MSDB','MODEL','TEMPDB','distribution')
FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(max)'), 1, 2, '')
SELECT [@db_list] =@db_list
exec sp_foreachdb @database_list = @db_list
,@exclude_list = 'dba,tablebackups,master,msdb,model,tempdb'
,@command='use ?;begin try EXEC sp_droprolemember @rolename = [db_denydatawriter], @membername = [mycompany\Developers] end try begin catch end …Run Code Online (Sandbox Code Playgroud) 我有一个res_users带有主键的表id
我想列出id数据库中所有表的所有外键链接。
scripting ×10
sql-server ×4
postgresql ×3
replication ×2
amazon-rds ×1
backup ×1
constraint ×1
delete ×1
dynamic-sql ×1
foreign-key ×1
jobs ×1
migration ×1
monitoring ×1
permissions ×1
primary-key ×1
restore ×1
select ×1
sql-clr ×1