使用以下方法将单个孤立的 SQL 用户修复为登录是相当直接的:
EXEC sp_change_users_login 'Auto_Fix', '用户'
我可以编写这个脚本,但是是否有一个现有的存储过程可以自动尝试修复给定数据库中的每个孤立用户?
在 SQL Server 中创建存储过程时,您可以引用不存在的表。但是,如果该表确实存在,那么您在该过程中引用的任何列都必须存在于该表中(延迟名称解析)。
是否可以指示 SQL Server 推迟过程中引用的所有表的名称解析,而不管它们是否存在?我确实希望保留一般语法检查,因此即使可能,将存储过程定义破解到系统表中也不是一种选择。
我希望我的要求做到这一点可能看起来有点怪异,所以这里的一些背景:我自动从C#编写的应用程序生成表定义和存储过程,这是非常困难的,我改变代码顺序进行更改为SQL需求他们。我的代码“保证”架构在事务中是一致的,但目前我不能保证在定义引用它们的存储过程之前定义表列。
下面是 C# 创建的 SQL 的规范示例,它“说明”了我试图解决的问题。
--Say this table already exists.
CREATE TABLE myTable
(
a NVARCHAR(MAX)
)
GO
--My C# code creates something like this
BEGIN TRAN
GO
--the stored procedure gets generated first.
CREATE PROCEDURE mySproc
AS
BEGIN
SELECT a,b FROM myTable
END
--then the table update
ALTER TABLE myTable
ADD b nvarchar(MAX)
COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)
我有可能在 C# 代码中修复这个问题,但我希望能有一个简单的“魔法”调整我可以拉入 SQL。这将为我节省很多时间。
我有一个带有标识列的表,我想保留一个可用于批量插入的 id 块,同时允许插入仍然发生在该表中。
请注意,这是多个表的批量插入的一部分,其中其他表通过 FK 与这些 id 相关。因此,我需要将它们挡在外面,以便我可以事先准备好关系。
我找到了一个解决方案,它通过在事务中锁定表然后进行重新播种(非常快)来工作。但这对我来说看起来有点老套 - 这样做是否有普遍接受的模式?
create table dbo.test
(
id bigint not null primary key identity(1,1),
SomeColumn nvarchar(100) not null
)
Run Code Online (Sandbox Code Playgroud)
这是阻止(为)一些 id 的代码:
declare @numRowsToMakeRoomFor int = 100
BEGIN TRANSACTION;
SELECT MAX(Id) FROM dbo.test WITH ( XLOCK, TABLOCK ) -- will exclusively lock the table whilst this tran is in progress,
--another instance of this query will not be able to pass this line until this instance commits
--get the next id in …Run Code Online (Sandbox Code Playgroud) 当我为数据库制作数据库主密钥时:
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Some Long Password'
Run Code Online (Sandbox Code Playgroud)
Microsoft 的此页面建议我在异地备份:
http://msdn.microsoft.com/en-us/library/ms174382.aspx
我已经通过测试确认备份数据库时存储了主密钥。我已经在备份数据库,并且已经安全地存储了密码。那么为什么我还需要备份主密钥呢?
(顺便说一句,我已经在备份服务主密钥并在异地存储)。
我正在尝试提高复杂存储过程的性能。存储过程内部是以下MERGE语句。我对MERGE语法不是很熟悉。
该[Contact].[PhoneNumber]表如下所示:
CREATE TABLE [Contact].[PhoneNumber]
(
[Id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[PhoneNumber] [nvarchar](255) NOT NULL
[InsertedAtDateTimeUTC] [datetime2](7) NOT NULL DEFAULT(sysutcdatetime())
)
Run Code Online (Sandbox Code Playgroud)
合并看起来像这样:
;WITH _ContactPhoneNumbers ([PhoneNumber]) AS
(
SELECT DISTINCT ([#ChannelData].[CallerAni])
FROM [#ChannelData]
)
MERGE [Contact].[PhoneNumber] WITH (HOLDLOCK) _target
USING [_ContactPhoneNumbers] _source ON [_target].[PhoneNumber] = [_source].[PhoneNumber]
WHEN NOT MATCHED THEN
INSERT ([PhoneNumber])
VALUES ([PhoneNumber])
WHEN MATCHED THEN
UPDATE
SET [_target].[PhoneNumber] = [_source].[PhoneNumber]
OUTPUT INSERTED.[Id], [_source].[PhoneNumber] INTO #Contact_PhoneNumber_Output ([Id], [PhoneNumber]);
Run Code Online (Sandbox Code Playgroud)
我把它读为:
如果表PhoneNumber中不存在 …