我修改了数据库中的一个中央表,sp_depends 确实返回了数百个结果,我担心其中一些存储过程在我更改后可能不再编译。
检查单个存储过程很容易(我只是重新运行alter 脚本并查看操作是否成功),但是对100 多个过程执行此操作有点麻烦。
我知道我可以使用脚本像这样一个重新编译我的数据库中的所有对象,但实际操作中会发生下一次的存储过程执行,而不是立即,这样似乎并不在我的情况适合。
我还想我可以完全删除所有的存储过程,并用我的源代码控制系统重新同步我的数据库,但是这个选项虽然可行,但不是很优雅。有没有更好的方法来做到这一点?
我使用的是 SQLServer 2008 R2,我的数据库脚本存储在 VS 2008 数据库项目中。
澄清一下,我并不是主张人们应该仅仅依靠这种方法来测试代码。就像在 c# 中一样,您在编写代码时会立即检测其他依赖文件中的语法错误(然后使用其他策略进行测试,例如单元测试,这通常会慢几个数量级),我认为检测 SQL 依赖关系是有意义的在几秒钟内出错,而不必运行通常需要几个小时才能完成的完整功能测试。
SQL 管理工作室允许为所有 db 对象创建脚本,但是到目前为止我找不到正确编写模式或用户脚本的方法。用户对架构的权限不包含在创建的脚本中。我做错了什么还是微软她有点马虎?
我一直在研究 PowerShell,并且我一直(慢慢地)将它融入到我的日常 DBA 任务中。
到目前为止,我已经看到了许多用于许多不同管理活动的断开连接的 PowerShell 脚本。
我想知道的是,是否有官方(或可识别的)PowerShell 脚本集合或存储库,人们通常会使用这些集合或存储库来获取用于常见 DBA 活动的 SQL Server PowerShell 脚本(例如 Ola Hallengren 的 T-SQL 脚本)。
不知何故,似乎 SQL*Plus(至少在 Windows 上)在调用 with@@以及路径以单点或双点开头时无法定位具有相对路径的脚本。
例如,在x:\some\whereI下有以下目录结构:
script.sql
main-dir\main-sub-dir
call-script.sql
script.sql
Run Code Online (Sandbox Code Playgroud)
即:两个script.sql但在不同的位置。
script.sql刚刚下的内容x:\some\where简直了
prompt SCRIPT root
Run Code Online (Sandbox Code Playgroud)
而另一个script.sql的内容是
prompt SCRIPT main-dir/main-subdir
Run Code Online (Sandbox Code Playgroud)
call-script.sql 阅读
@@script.sql
@ script.sql
Run Code Online (Sandbox Code Playgroud)
如果我从 SQL*Plus 启动x:\some\where然后执行
@main-dir/main-sub-dir/call-scripts
Run Code Online (Sandbox Code Playgroud)
输出将是
SCRIPT main-dir/main-subdir
SCRIPT root
Run Code Online (Sandbox Code Playgroud)
这是意料之中的,因为单曲@应该从 SQL*Plus 的启动位置@@搜索路径,并且应该从包含脚本的目录中搜索路径。
现在,如果我call-scripts.sql这样改变:
@@./script.sql
@ ./script.sql
Run Code Online (Sandbox Code Playgroud)
double@@似乎改变了它的行为,因为它从 SQL*Plus 开始的位置搜索路径,现在输出将是
SCRIPT root
SCRIPT root
Run Code Online (Sandbox Code Playgroud)
这不是我所期望的。
这种行为是否记录在某处,更重要的是,我必须如何更改call-scripts.sql才能@@../../other-dir/other-sub-dir/script正确调用相对路径 ( …
我试图通过执行 SQL Server Management Studio 中的“生成脚本”工具生成的脚本将数据库部署到机器上。
这是我发出的命令:
sqlcmd -S LOCALHOST\sqlexpress -I -U user -P ******** -i
C:\Rollouts\NI-9-25-2012_10-42-AM\Rollout.sql > rolloutlog.txt
Run Code Online (Sandbox Code Playgroud)
我收到这样的错误:
Sqlcmd: 错误: 文件'C:\Rollouts\ NI-9-25-2012_10-42-AM\Rollout.sql'中命令'''附近的第39488行语法错误。
当我使用文本编辑器查看此行时,所有迹象都指向一个带引号的问题。
有问题的行看起来像这样:
$(''.cat-menu-new'').slideDown(''慢'');
是否有我应该执行或生成脚本以支持脚本中的引号的开关?
我正在使用 psql 命令 \copy 并且我想从 shell 传递一个变量(用于表名),就像我在编写查询脚本时所做的那样。我在 psql 的文档中读到:
该命令的语法类似于 SQL COPY 命令的语法。请注意,因此,特殊的解析规则适用于 \copy 命令。特别是,变量替换规则和反斜杠转义不适用。
这似乎很确定,但是我想知道是否有人知道解决方法?
最近我意识到默认情况下,编写数据库的脚本不包括索引,我每次都必须更改该选项。
任何人都可以请解释原因吗?是否对这种默认行为有任何见解,或者仅仅是因为 Microsoft 喜欢这样做?
尝试使用 SQLCMD 模式整理我的 SQL 脚本时遇到了一个问题:
:setvar db_suffix "some_suffix"
:setvar some_db "some_db_$(db_suffix)"
print 'some_db: $(some_db)'
Run Code Online (Sandbox Code Playgroud)
其输出是:
some_db: some_db_$(db_suffix)
Run Code Online (Sandbox Code Playgroud)
然而,我的预期是:
some_db: some_db_some_suffix
Run Code Online (Sandbox Code Playgroud)
有没有办法像这样进行变量插值?
(请注意,诸如此类的 T-SQL 函数CONCAT()将不起作用,因为我将使用该变量作为数据库名称)。
我需要使用散列密码编写应用程序角色的脚本,以便我可以将它从一个数据库复制到另一个数据库。
考虑以下示例代码,它使用应用程序角色为不受信任的用户提供提升的访问权限:
USE tempdb;
CREATE LOGIN LimitedLogin
WITH PASSWORD = 'Password1'
, CHECK_POLICY = OFF
, CHECK_EXPIRATION = OFF;
CREATE USER LimitedLogin
FOR LOGIN LimitedLogin
WITH DEFAULT_SCHEMA = dbo;
CREATE APPLICATION ROLE MyAppRole
WITH PASSWORD = 'Password2'
, DEFAULT_SCHEMA = dbo;
EXEC sp_addrolemember @rolename = 'db_datareader'
, @membername = 'MyAppRole';
CREATE TABLE dbo.Numbers
(
[Number] int CONSTRAINT PK_Numbers
PRIMARY KEY CLUSTERED
IDENTITY(1,1) NOT NULL
);
INSERT INTO dbo.Numbers
VALUES (1)
, (2);
GO
Run Code Online (Sandbox Code Playgroud)
一旦我们在 tempdb 中创建了测试设置,我们就可以以[LimitedLogin]用户身份登录,并运行以下命令:
-- login …Run Code Online (Sandbox Code Playgroud) 我正在将 SQL Server DB 迁移到新实例。
有人告诉我,可以从系统目录中的可用备份动态构建 RESTORE 脚本。
有谁知道一个示例脚本来做到这一点?
谢谢!
scripting ×10
sql-server ×5
ssms ×3
sqlcmd ×2
automation ×1
bulkcopy ×1
catalogs ×1
management ×1
oracle ×1
postgresql ×1
powershell ×1
psql ×1
restore ×1
role ×1
security ×1
sqlplus ×1